【问题标题】:Check if property is set in Core Data?检查是否在核心数据中设置了属性?
【发布时间】:2014-10-28 22:42:00
【问题描述】:

如何检查核心数据对象中是否设置了属性?

我将所有核心数据对象加载到一个目录中:

var formQuestions = [Questions]()

而我的核心数据 NSManagementObject 是:

@NSManaged var noticeText: String

formQuestions[indexPath.row].noticeText

// 加载:

var fetchRequest = NSFetchRequest(entityName: "Questions")
fetchRequest.predicate = NSPredicate(format: "forms = %@", currentForm!)
formQuestions = context.executeFetchRequest(fetchRequest, error: nil) as [Questions]

我的属性“noticeText”可能为空,所以当我创建我的核心数据对象时,一些值可能没有设置。 (该属性在 Core Data 中设置为可选)

当我现在尝试证明是否有值时,它总是给我带来“EXC_BAD_ACCESS....”

if(formQuestions[indexPath.row].noticeText.isEmpty == false)

我可以在创建核心数据对象时设置一个空字符串,但这应该不是一个好的解决方案。

那么我如何检查是否存在(可选)而不是设置的值?

提前致谢。

【问题讨论】:

  • @NSManaged var noticeText: String -- 这不是可选的 -- 使用 !要么 ?看你想要什么
  • 哦,我的错。但是我用 Editor->CreateNSManagedSublcas 完成了这个并且没有?当我使用“可选”时-但这不是我的问题-我仍然不知道如何检查该属性是否已设置。

标签: ios swift core-data


【解决方案1】:

Xcode 7 更新:Xcode 7 beta 2 解决了这个问题。 可选核心数据属性现在定义为可选属性 在 Xcode 生成的托管对象子类中。它不再是 需要编辑生成的类定义。


(上一个答案:)

在创建NSManagedObject 子类时,Xcode 不会为那些在 Core Data 模型检查器中标记为“可选”的属性定义可选属性。 这对我来说似乎是一个错误。

作为一种解决方法,您可以将属性转换为 一个可选的(在您的情况下为as String?),然后使用可选绑定对其进行测试

if let notice = someManagedObject.noticeText as String? {
    println(notice)
} else {
    // property not set
}

在你的情况下

if let notice = formQuestions[indexPath.row].noticeText as String? {
    println(notice)
} else {
    // property not set
}

更新:从 Xcode 6.2 开始,此解决方案不再有效 并因 EXC_BAD_ACCESS 运行时异常而崩溃 (比较Swift: detecting an unexpected nil value in a non-optional at runtime: casting as optional fails

下面的“旧答案”解决方案仍然有效。


(旧答案:)

正如@Daij-Djan 在评论中所述,您必须为 可选的核心数据属性为可选隐式解包可选

@NSManaged var noticeText: String? // optional
@NSManaged var noticeText: String! // implicitly unwrapped optional

很遗憾,Xcode 在创建时没有正确定义可选属性 NSManagedObject 子类,这意味着您必须重新应用更改 如果您在模型更改后再次创建子类。

这似乎仍然没有记录,但两种变体在我的测试用例中都有效。

您可以使用== nil 测试该属性:

if formQuestions[indexPath.row].noticeText == nil {
    // property not set
}

或者带有一个可选的赋值:

if let notice = formQuestions[indexPath.row].noticeText {
    println(notice)
} else {
    // property not set
}

【讨论】:

  • String和String有什么区别!在这种情况下?为什么有必要隐式打开它?为什么不将其保留为 String ?
  • @cfisher:字符串不能为零。 - 但我建议向 Apple 提交错误报告。 Xcode 应该为可选属性生成正确的代码。
  • 如果反对者可以留下解释性评论?如果这里有任何问题,我会非常感兴趣,并在必要时修复答案。
  • 在 Xcode 7b5/b6 上,我只获得为 NSManagedObject 子类扩展生成的可选 Xcode。
【解决方案2】:

您的应用程序崩溃了,因为您尝试访问 nilnot optional variable。这在 swift 中是不允许的。要解决您的问题,只需添加 NSManagedObject 子类 ? 以使属性可选:

@objc class MyModel: NSManagedObject {
    @NSManaged var noticeText: String? // <-- add ? here
}

然后要测试属性,您可以这样做:

if let aNoticeText = formQuestions[indexPath.row].noticeText? {
    // do something with noticeText
}

【讨论】:

    猜你喜欢
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    相关资源
    最近更新 更多