【问题标题】:Swift - casting a nil core data string as an optional valueSwift - 将 nil 核心数据字符串转换为可选值
【发布时间】: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? { } 应该工作,这是stackoverflow.com/a/25664102/1187415中的建议。它是否无法编译、崩溃或如何“不起作用”?

标签: ios swift optional


【解决方案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 子类进行更改,这就是为什么我在事后尝试将其转换为可选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-05
  • 2015-10-28
  • 2015-02-25
  • 1970-01-01
相关资源
最近更新 更多