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

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

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

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”可能是空的或不是,所以当我创build我的核心数据对象时,可能没有设置一些值。 (该属性在核心数据中设置为可选)

当我现在尝试certificate如果有价值,它总是给我一个“EXC_BAD_ACCESS ….”

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

我可以设置一个空string,当我创build我的核心数据对象,但这应该不是一个好的解决scheme。

那么如何检查(optinal)而不是设定值?

提前致谢。

Xcode 7的更新:这个问题已经被Xcode 7 beta 2解决了。可选的Core Data属性现在被定义为Xcode生成的托pipe对象子类中的可选属性。 不再需要编辑生成的类定义。


(之前的回答:)

在创buildNSManagedObject子类时,Xcode没有为核心数据模型检查器中标记为“可选”的属性定义可选属性。 这看起来像是一个bug。

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

 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开始,这个解决scheme不再工作,并且崩溃了一个EXC_BAD_ACCESS运行时exception(比较Swift:在运行时检测到一个非可选的nil值:作为可选的cast失败失败 )

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


(老回答:)

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

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

不幸的是,Xcode在创buildNSManagedObject子类时没有正确定义可选属性,这意味着如果在模型更改后再次创build子类,则必须重新应用更改。

此外,这似乎还没有logging,但这两个变种在我的testing案例工作。

你可以用== nil来testing这个属性:

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

或者可选的作业:

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

你的应用程序崩溃,因为你试图访问一个not optional variable 。 这是不允许的。 要解决你的问题,只需在NSManagedObject子类中添加一个? 使该属性可选:

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

然后testing你可以这样做的属性:

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