作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个对象 FormField,它有两个属性:一个字符串 name
和一个可以接受任何类型的 value
——因此我把它变成了 任何!
。然而,有人告诉我 a separate question使用具有关联值的枚举而不是 Any!
。
enum Value {
case Text(String!)
case CoreDataObject(NSManagedObject!)
}
class FormField {
var name: String
var value: Value?
// initializers...
}
然而,这种方法使得检查无效性变得非常冗长。如果我想为表单中所有缺失的字段显示一个警报 View ,我将不得不在 switch 语句中对每个 case 重复一次 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)
}
}
最佳答案
在 enum
中定义一个方法 isMissing()
- 只写一次。然后你几乎完全得到你喜欢的东西:
for field in self.fields {
if field.value.isMissing() {
missingFields.append(field.name)
}
}
它看起来像这样(来自 Swift Interpreter):
1> class Foo {}
>
2> enum Value {
3. case One(Foo!)
4. case Two(Foo!)
5.
6. func isMissing () -> Bool {
7. switch self {
8. case let .One(foo): return foo == nil
9. case let .Two(foo): return foo == nil
10. }
11. }
12. }
13> let aVal = Value.One(nil)
aVal: Value = One {
One = nil
}
14> aVal.isMissing()
$R0: Bool = true
关于ios - 无论枚举大小写如何,如何快速获得枚举的关联值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25880789/
我是一名优秀的程序员,十分优秀!