【发布时间】:2014-09-16 08:11:19
【问题描述】:
我有一个名为 Field 的自定义对象。我基本上用它来定义表单中的单个字段。
class Field {
var name: String
var value: Any?
// initializers here...
}
当用户提交表单时,我会验证每个 Field 对象以确保它们包含有效值。有些字段不是必需的,所以我有时故意将nil 设置为value 属性,如下所示:
field.value = nil
当我使用 if-let 来确定字段是否为 nil 时,这似乎会造成问题。
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.
}
我在上面的 if-else 中设置了断点,当 field.value 被故意设置为 nil 时,它会通过 if-let 块,而不是 else。 但是,对于那些field.value 我未初始化和未分配,程序转到 else 块。
我尝试在 if-let 块内打印出 field.value 和 value:
if let value = field.value {
NSLog("field.value: \(field.value), value: \(value)")
}
这就是我得到的:
field.value:可选(nil),值:nil
所以我认为,也许对于可选项,未初始化是一回事,而值为 nil 则是另一回事。但即使在 if-let 中添加另一个 if 也不会让编译器满意:
if let value = field.value {
if value == nil { // Cannot invoke '==' with an argument list of type '(Any, NilLiteralConvertible)'
}
}
我该如何解决这个问题?我只想检查field.value 是否为nil。
【问题讨论】:
-
无法复制。您使用哪个 Xcode 版本?
-
Xcode 6 通用。尝试重新启动它,仍然没有运气。 :(
-
您能否发布一个完整的独立示例来演示该问题?
-
不要试图使用
Any。通过使用Any,你放弃了一半的 Swift 特性(强类型)。为什么不在那里使用一个不错的泛型类型? -
@MattQuiros:所以使用具有两种情况的枚举:
case CoreDataObject(NSManagedObject)和case StringField(String),然后使用该枚举的可选类型而不是Any?。
标签: ios cocoa cocoa-touch swift optional