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 variable是nil.这在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)
| 归档时间: |
|
| 查看次数: |
12526 次 |
| 最近记录: |