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

时间:2014-12-10 22:12:56

标签: ios swift optional

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

if object.metadata as String? != nil {
    ...
} 

然而,我的代码在此行上连续崩溃为EXC_BAD_ACCESS。我也尝试过:

if let metadata = object.metadata as String? {
    ...
}

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

1 个答案:

答案 0 :(得分:5)

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

if object.metadata != nil {
    ...
}

或者这个:

if let metadata = object.metadata as? String {
    // You can now freely access metadata as a non-optional
    ...
}

<强> - 编辑 -

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

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

Check if property is set in Core Data?

Swift + CoreData: Cannot Automatically Set Optional Attribute On Generated NSManagedObject Subclass

<强> - EDIT2 -

如果您确实想要触摸子类,您可以使用valueForKey()访问该属性,如果您想要更清洁的话,可以将其添加为扩展名。< / p>

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?
        }
    }
}