Swift - 将空的 Core Data 字符串强制转换为可选值

3

我有一个存储在核心数据对象中的字段,称为“metadata”,其类型为String(没有可选项,因为苹果文档说不要操纵CD中的可选项)。有时,“metadata”字段为空值。在检查此值是否为空时,我执行以下检查:

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

然而,我的代码在这一行持续崩溃,出现了EXC_BAD_ACCESS错误。我也尝试过:
if let metadata = object.metadata as String? {
    ...
}

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


可能需要查看崩溃的详细信息。这可能与强制转换无关,而是与对象及其分配有关。此外,当您说在代码的其他部分成功地进行了对象转换时,它们也是字符串吗?每次都会崩溃吗? - shim
@shim 是的 - 实际上,是完全相同的属性。我有三个带有此属性的对象。前两个不是 nil,它可以正常通过。最后一个是 nil,这就是导致程序崩溃的地方。 - user3781236
也许可以发布NSManagedObject子类文件? - shim
尝试使用 if let metadata = object.metadata as? String {...} - Ian
@MartinR 它编译成功了,但是和之前一样崩溃并出现了 EXC_BAD_ACCESS 错误。 - user3781236
显示剩余2条评论
1个回答

5
看起来你真正想要的是这个:
if object.metadata != nil {
    ...
}

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

--编辑--

抱歉,我没有仔细阅读您问题的第一部分。看起来重复的答案已经解决了这个问题。实际上,生成的托管对象子类是一个错误,您应该将属性修改为可选或隐式解包。您可以使用第一种方法检查隐式解包和第二种方法检查可选。

有几个问题讨论了生成的子类未产生可选属性的问题。我不会太担心编辑子类;它们并没有什么特别之处,除了苹果正在使创建它们变得更容易。

检查Core Data中是否设置了属性?

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

--编辑2--

如果你真的不想修改子类,你可以使用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?
        }
    }
}

我已经尝试了两种方法。第一种方法出现错误:类型 'NSString' 无法符合协议 'NilLiteralConvertible'。第二种方法出现错误:将 'String' 条件下转换为 'String' 总是成功 - user3781236
@Bluehound - 是的,我确定我已经尝试了他上面列出的两个选项,但都没有起作用。 - user3781236
那么,如果它在数据模型中始终被定义,为什么需要将其转换为可选项呢? - Ian
@bjtitus:修改生成的文件只是第二好的解决方案(“旧答案”)。是的,您可以将类型包装成可选项。类似的解决方法在https://developer.apple.com/library/ios/releasenotes/DeveloperTools/RN-Xcode/Chapters/xc6_release_notes.html中有记录:“如果您遇到一个方法、属性或初始化程序,其返回值被错误地认为是非空的,您可以通过将结果包装在可选项中来解决问题:”。 - Martin R
@user3781236,请查看我的更新并确认是否是一个合适的解决方案。 - bjtitus
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接