代码之家  ›  专栏  ›  技术社区  ›  derdida

检查是否在核心数据中设置了属性?

  •  14
  • derdida  · 技术社区  · 12 年前

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

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

    var formQuestions = [Questions]()
    

    我的核心数据NSManagementObject是:

    @NSManaged var noticeText: String
    

    表单问题[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)
    

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

    那么,如何检查是否存在(可选)和未设置的值?

    提前感谢。

    2 回复  |  直到 10 年前
        1
  •  29
  •   Community Mohan Dere    9 年前

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


    (上一个答案:)

    创建 NSManagedObject 子类,Xcode没有为那些在核心数据模型检查器中标记为“可选”的属性定义可选的财产。 这对我来说就像一个bug。

    作为解决方法,可以将属性强制转换为 可选的( 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 )

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


    (旧答案:)

    正如@DaijDjan在评论中所说的,您必须为 可选核心数据属性为 可选择的 隐式展开可选 :

    @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
    }
    
        2
  •  5
  •   ant_one    12 年前

    您的应用程序正在崩溃,因为您尝试访问 not optional variable 那就是 。这在swift中是不允许的。要解决您的问题,只需添加 NSManagedObject 子类a ? 要使属性为可选属性,请执行以下操作:

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

    然后,要测试属性,可以执行以下操作:

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