Ios Swift-将零核心数据字符串转换为可选值

Ios Swift-将零核心数据字符串转换为可选值,ios,swift,optional,Ios,Swift,Optional,我在一个名为“metadata”的核心数据对象上存储了一个字段,它的类型是String(没有可选字段,因为苹果文档说不要在CD中乱用可选字段)。有时,元数据字段为零。在检查此值是否为零时,我执行以下检查: if object.metadata as String? != nil { ... } 但是,我的代码作为一个EXC\u BAD\u访问在这一行连续崩溃。我也尝试过: if let metadata = object.metadata as String? { ... }

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

if object.metadata as String? != nil {
    ...
} 
但是,我的代码作为一个
EXC\u BAD\u访问
在这一行连续崩溃。我也尝试过:

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

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

看起来你真正想要的是:

if object.metadata != nil {
    ...
}
或者这个:

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

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

有几个问题讨论生成的子类不生成可选属性的问题。我不会太在意编辑子类;它们没有什么特别之处,只是苹果正在使它们的制作变得更容易

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

可能有助于了解坠机的更多细节。可能与铸造无关,而是对象及其分配。另外,当您说您已经在代码的其他部分成功地铸造了对象时,它们也是字符串吗?每次都会崩溃吗?@shim是的-事实上,完全相同的属性。我有三个具有此属性的对象。前两项不是零,它可以通过。最后一个是nil,这就是它崩溃的地方。是否可以发布NSManagedObject子类文件?如果让metadata=object.metadata as,请尝试
?字符串{…}
如果让metadata=object.metadata作为字符串?{}
应该可以工作,这是a中建议的。它不是编译、崩溃还是“不工作”?我已经试过了。对于第一个,错误是:类型“NSString”不符合协议“NilLiteralConvertible”。第二个错误是:从“字符串”到“字符串”的条件向下转换总是成功的。你确定吗?注意他的答案和我的评论中的问号位置,与您提供的代码相比,以及第二个答案中的错误,听起来object.metadata根本不是可选的,因此,如果您提供您的对象类,它可能对我们帮助您解决问题很有用。我似乎也没有彻底阅读这个问题。OP的第二次尝试正是我在回答“可能的重复”时所建议的。因此,我将重新提出这个问题…@Btitus-我被明确告知,我不应该在swift中对核心数据子类进行更改,这就是为什么我试图在事后将其转换为可选的。