Swift – 将nil核心数据字符串转换为可选值
我有一个存储在名为“metadata”的核心数据对象上的字段,其类型为String
(不是可选的,因为Apple文档说不要乱用CD中的选项)。 有时,元数据字段为零。 在检查此值是否为零时,我执行以下检查:
if object.metadata as String? != nil { ... }
但是,我的代码在此行上连续崩溃为EXC_BAD_ACCESS
。 我也尝试过:
if let metadata = object.metadata as String? { ... }
哪个也行不通。 我成功地将对象转换为代码的其他部分中的选项,所以我不明白为什么这个特殊情况不起作用。 如何检查核心数据属性是否为零字符串?
看起来你真正想要的是这个:
if object.metadata != nil { ... }
或这个:
if let metadata = object.metadata as? String { // You can now freely access metadata as a non-optional ... }
– 编辑 –
我的错误,我没有彻底阅读你问题的第一部分。 看起来重复的答案有一个解决方案。 本质上,生成的托管对象子类是一个错误,您应该将属性修改为可选或隐式展开。 您可以使用第一种方法检查这两种方法以进行隐式展开,将第二种方法用于选项。
有几个问题讨论了生成的子类不生成可选属性的问题。 我不会太在意编辑子类; 除了Apple让它们更容易创建它们之外,没有什么特别之处。
检查核心数据中是否设置了属性?
Swift + CoreData:无法在生成的NSManagedObject子类上自动设置可选属性
–Edit2–
如果你真的不想触摸子类,你可以使用valueForKey()
访问该属性,如果你想要一些更清洁的东西可以添加它作为扩展。
if let metadata = object.valueForKey("metadata") as String? { ... }
在扩展中:
extension ObjectClass { var realMetadata: String? { set { self.setValue(newValue, forKey: "metadata") } get { return self.valueForKey("metadata") as String? } } }