【发布时间】:2014-11-10 21:53:52
【问题描述】:
我有一个对象 FormField,它有两个属性:一个字符串name,和一个可以接受任何类型的value——因此我把它做成了Any!。但是,a separate question 告诉我使用带有关联值的枚举而不是 Any!。
enum Value {
case Text(String!)
case CoreDataObject(NSManagedObject!)
}
class FormField {
var name: String
var value: Value?
// initializers...
}
然而,这种方法使得检查无效性变得非常冗长。如果我想为表单中的所有缺失字段显示警报视图,我将不得不在 switch 语句中对每个案例重复一次 nil 检查:
for field in self.fields {
if let value = field.value {
switch value {
case .Text(let text):
if text == nil {
missingFields.append(field.name)
}
case .CoreDataObject(let object):
if object == nil {
missingFields.append(field.name)
}
}
}
}
是否有更短的方法来访问枚举的关联值,而不管其类型如何?如果我将 FormField.value 设为 Any!,则上面的代码将很简单:
for field in self.fields {
if field.value == nil {
missingFields.append(field.name)
}
}
【问题讨论】:
-
您可以在
case语句中使用where子句删除几行:case .Text(let text) where text == nil:。 -
@MikeS 很棒的提示,谢谢。这样我就可以为每个可以为 nil 的情况设置一个
where子句并让它失败。不过,我会用Any!回去。使其成为枚举需要我编写过于冗长的代码。 -
这不只是移动冗长吗?我假设在某些时候你必须知道那些
Anys 的实际类型,然后你会做一堆if value is String、if value is NSManagedObject等等。 -
另外,
value已经是您的FormField类中的可选内容。如果您只设置FormField的value,当有一个时,您已经可以只检查if field.value == nil。这意味着您也不需要将您的enum的关联值隐式解包选项。 -
@MikeS 除非我将关联的值设为可选,否则我无法将它们与 nil 进行比较。编译器抱怨关联值的类型不符合
NilLiteralConvertible。
标签: ios cocoa cocoa-touch swift