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

der*_*ida 13 core-data ios swift

如何检查是否在Core Data Object中设置了属性?

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

var formQuestions = [Questions]()
Run Code Online (Sandbox Code Playgroud)

我的核心数据NSManagementObject是:

@NSManaged var noticeText: String
Run Code Online (Sandbox Code Playgroud)

formQuestions [indexPath.row] .noticeText

//加载:

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

我的属性"noticeText"可能是空的或不是,所以当我创建我的核心数据对象时,可能无法设置某些值.(该属性在Core Data中设置为可选)

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

if(formQuestions[indexPath.row].noticeText.isEmpty == false)
Run Code Online (Sandbox Code Playgroud)

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

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

提前致谢.

Mar*_*n R 29

Xcode 7的更新:此问题已通过Xcode 7 beta 2解决.可选的Core Data属性现在被定义为Xcode生成的托管对象子类中的可选属性.不再需要编辑生成的类定义.


(上一个答案:)

创建NSManagedObject子类时,Xcode不会为核心数据模型检查器中标记为"可选"的属性定义可选属性.对我来说这看起来像个错误.

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

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

在你的情况下,将是

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

更新:从Xcode 6.2开始,此解决方案不再起作用并且与EXC_BAD_ACCESS运行时异常崩溃(比较Swift:在运行时检测非可选中的意外nil值:作为可选的强制转换失败)

下面的"旧答案"解决方案仍然有效.


(老答案:)

正如@ Daij-Djan已在评论中说明的那样,您必须将可选的Core Data属性的属性定义为可选隐式解包的可选:

@NSManaged var noticeText: String? // optional
@NSManaged var noticeText: String! // implicitly unwrapped optional
Run Code Online (Sandbox Code Playgroud)

不幸的是,Xcode中不能正确创建NSManagedObject子类时,这意味着你有,如果你的模型更改后重新创建子类重新申请更改定义可选属性.

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

你可以用以下方法测试房产== nil:

if formQuestions[indexPath.row].noticeText == nil {
    // property not set
}
Run Code Online (Sandbox Code Playgroud)

或者使用可选的作业:

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


小智 5

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

@objc class MyModel: NSManagedObject {
    @NSManaged var noticeText: String? // <-- add ? here
}
Run Code Online (Sandbox Code Playgroud)

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

if let aNoticeText = formQuestions[indexPath.row].noticeText? {
    // do something with noticeText
}
Run Code Online (Sandbox Code Playgroud)