检查是否在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值:作为可选失败时失败 )
下面的“旧答案”解决scheme仍然有效。
(老回答:)
正如@ Daij-Djan在评论中已经指出的那样,您必须将可选的Core Data属性的属性定义为可选或隐式解包可选 :
@NSManaged var noticeText: String? // optional @NSManaged var noticeText: String! // implicitly unwrapped optional
不幸的是,Xcode在创buildNSManagedObject子类时没有正确定义可选属性,这意味着如果在模型更改后再次创build子类,则必须重新应用更改。
此外,这似乎仍然是无证的,但两个变种在我的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 }