Mat*_*ros 5 cocoa cocoa-touch optional ios swift
我有一个名为Field的自定义对象.我基本上用它来定义表单中的单个字段.
class Field {
var name: String
var value: Any?
// initializers here...
}
Run Code Online (Sandbox Code Playgroud)
当用户提交表单时,我验证每个Field
对象以确保它们包含有效值.有些字段不是必需的,所以我有时会故意设置nil
为这样的value
属性:
field.value = nil
Run Code Online (Sandbox Code Playgroud)
当我使用if-let来确定字段是否为零时,这似乎会造成问题.
if let value = field.value {
// The field has a value, ignore it...
} else {
// Add field.name to the missing fields array. Later, show the
// missing fields in a dialog.
}
Run Code Online (Sandbox Code Playgroud)
我在上面的if-else中设置了断点,当field.value
故意设置为nil时,它会通过if-let块,而不是else.但是,对于field.value
我未初始化和未分配的字段,程序将转到else块.
我想打印出来field.value
,并value
在IF-让块内:
if let value = field.value {
NSLog("field.value: \(field.value), value: \(value)")
}
Run Code Online (Sandbox Code Playgroud)
这就是我得到的:
field.value:可选(零),值:nil
所以我认为可能有选择性,未初始化是一回事而另一个是nil的价值.但即使在if-let中添加另一个也不会让编译器满意:
if let value = field.value {
if value == nil { // Cannot invoke '==' with an argument list of type '(Any, NilLiteralConvertible)'
}
}
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?我只是想检查一下是field.value
不是nil
.
我相信这是因为Any?
允许任何值并且Optional.None
被解释为另一个值,因为它Optional
是一个枚举!
AnyObject?
应该无法执行此操作,因为它只能包含Optional.Some([any class object])
,而不允许使用Optional.Some(Optional)
value 的情况Optional.None
。
这甚至让人感到非常困惑。重点是:尝试AnyObject?
而不是Any?
看看是否有效。
更重要的是,马特的评论之一提到他想要使用的原因Any
是为了进行选择,该选择可以是用于文本输入的字段,也可以是用于选择核心数据对象的字段。
在这种情况下,Swifty 要做的事情是使用具有关联值的枚举,基本上与标记/区分联合相同。以下是声明、分配和使用此类枚举的方法:
enum DataSelection {
case CoreDataObject(NSManagedObject)
case StringField(String)
}
var selection : DataSelection?
selection = .CoreDataObject(someManagedObject)
if let sel = selection { // if there's a selection at all
switch sel {
case .CoreDataObject(let coreDataObj):
// do what you will with coreDataObj
case .StringField(let string):
// do what you will with string
}
}
Run Code Online (Sandbox Code Playgroud)
使用这样的枚举,无需担心哪些内容可能隐藏在其中Any?
。有两个案例,并且有记录。当然,选择变量可以是可选的,无需担心。
归档时间: |
|
查看次数: |
4170 次 |
最近记录: |