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

Posted

技术标签:

【中文标题】Swift - 将 nil 核心数据字符串转换为可选值【英文标题】:Swift - casting a nil core data string as an optional value 【发布时间】:2014-12-10 22:12:56 【问题描述】:

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

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

但是,我的代码作为EXC_BAD_ACCESS 在这一行不断崩溃。我也试过:

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

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

【问题讨论】:

可能有助于查看有关崩溃的更多详细信息。可能与强制转换无关,而与对象及其分配无关。另外,当你说你已经在代码的其他部分成功地转换了对象时,它们也是字符串吗?每次都崩溃吗? @shim 是的 - 事实上,完全相同的属性。我有三个具有此属性的对象。前两个不是零,它通过了。最后一个是 nil,这就是它崩溃的地方 可以发布 NSManagedObject 子类文件吗? 试试if let metadata = object.metadata as? String ... if let metadata = object.metadata as String? 应该工作,这是***.com/a/25664102/1187415中的建议。它是否无法编译、崩溃或如何“不起作用”? 【参考方案1】:

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

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() 访问该属性,如果您想要更简洁的东西,可以将其添加为扩展。

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”。到第二个,错误是:Conditional downcast from 'String' to 'String' always succeeds 你确定吗?请注意与您提供的代码相比,他的答案和我的评论中的问号位置 从您遇到的第二个错误来看,听起来 object.metadata 根本不是可选的,所以如果您提供您的对象类,它可能对我们帮助您有用你的问题 看来我也没有仔细阅读这个问题。 OP 的第二次尝试正是我在回答“可能重复”时所建议的。因此,我将重新提出问题... @bjtitus - 有人明确告诉我,我不应该在 swift 中对 Core Data 子类进行更改,这就是为什么我在事后尝试将其转换为可选项。

以上是关于Swift - 将 nil 核心数据字符串转换为可选值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中将多字符数字格式转换为可读的字符串?

swift 可选项(Optional)

未为结构实现协议可枚举。如何将结构转换为可枚举?

Swift 3.0 - 核心数据 / 意外发现 nil

iOS:Swift:核心数据:错误:+entityForName:nil 不是搜索实体名称的合法 NSManagedObjectContext 参数

Swift - 无法将核心数据转换为 url 参数