Swift - 将nil核心数据字符串作为可选值进行转换

use*_*236 3 optional ios swift

我有一个存储在核心数据对象上的字段,称为"元数据",它是一种类型String(没有可选,因为Apple文档说不要乱用CD中的选项).有时,元数据字段为零.在检查此值是否为零时,我执行以下检查:

if object.metadata as String? != nil {
    ...
} 
Run Code Online (Sandbox Code Playgroud)

但是,我的代码在这一行上不断崩溃EXC_BAD_ACCESS.我也尝试过:

if let metadata = object.metadata as String? {
    ...
}
Run Code Online (Sandbox Code Playgroud)

哪个也行不通.我成功地将对象转换为代码的其他部分中的选项,所以我不明白为什么这个特殊情况不起作用.如何检查核心数据属性是否为零字符串?

bjt*_*tus 5

看起来你真正想要的是这个:

if object.metadata != nil {
    ...
}
Run Code Online (Sandbox Code Playgroud)

或这个:

if let metadata = object.metadata as? String {
    // You can now freely access metadata as a non-optional
    ...
}
Run Code Online (Sandbox Code Playgroud)

- 编辑 -

我的错误,我没有彻底阅读你问题的第一部分.看起来重复的答案有一个解决方案.本质上,生成的托管对象子类是一个错误,您应该将属性修改为可选或隐式展开.您可以使用第一种方法检查这两种方法,用于隐式展开,第二种方法用于选项.

有几个问题讨论了生成的子类不生成可选属性的问题.我不会太在意编辑子类; 除了Apple让它们更容易创建它们之外没有什么特别之处.

检查核心数据中是否设置了属性?

Swift + CoreData:无法在生成的NSManagedObject子类上自动设置可选属性

--Edit2--

如果你真的不想触摸子类,你可以使用它来访问该属性valueForKey(),如果你想要一些更清洁的东西可以添加它作为扩展.

if let metadata = object.valueForKey("metadata") as String? {
    ...
}
Run Code Online (Sandbox Code Playgroud)

在扩展中:

extension ObjectClass {
    var realMetadata: String? {
        set {
            self.setValue(newValue, forKey: "metadata")
        }
        get {
            return self.valueForKey("metadata") as String?
        }
    }
}
Run Code Online (Sandbox Code Playgroud)