ios - swift + 核心数据 : Can not set a Bool on NSManagedObject subclass - Bug?

标签 ios objective-c core-data swift

我有一个我似乎无法弄清楚的奇怪问题,我有一个带有自定义 NSManagedObject 子类的简单实体:

@objc(EntityTest) class EntityTest: NSManagedObject {

    @NSManaged var crDate: NSDate
    @NSManaged var name: String
    @NSManaged var completed: Bool
    @NSManaged var completedOn: NSDate
}

这就是问题所在,我可以很好地创建对象并设置所有值并将其存储在一个数组中。但是后来,当我尝试检索同一个对象时,我可以设置除“已完成”字段之外的所有值。我收到一个运行时错误“EXC_BAD_ACCESS”,我可以读取该值,但无法设置它。

调试器指向:

0x32d40ae:  je     0x32d4110                 ; objc_msgSend + 108
0x32d40b0:  movl   (%eax), %edx

可能由于它被视为 Objective-C 类并尝试发送消息以设置 bool 值而出现一些问题,我知道这有点有趣,因为 CoreData 最初将它们表示为 NSNumbers。

有什么想法吗?我自己创建了这个类,它没有生成。

编辑:

entity.crDate = NSDate() // succeeds
entity.completed = false // fails
entity.completed.setValue(false, forKey: "completed") //succeeds

因此,对于设置 bool,使用 NSManagedObject 的 setValue 可以,但不能使用直接 setter,尽管对于非 bool 属性,我可以使用 setter 进行设置。

更新:

再仔细检查一下,似乎是我第一次在从 NSEntityDescription 获取值后设置值,它使用普通的 Swift 访问器方法。稍后,当我尝试访问同一个对象(存储在数组中)时,它会尝试将其视为 Objective-C 样式对象,并为名为“setCompleted”的方法发送一条消息。我想这是有道理的,因为我使用点符号来访问它并且我使用了@objc 指令。

我通过创建一个“setCompleted”方法对此进行了测试,但是在该方法中我使用“completed = newValue”设置了值,这使得递归调用返回“setCompleted”导致它崩溃......奇怪,所以在这个时刻仍然不能没有适当的修复。这似乎只发生在 Bools 上。

唯一的解决方法是使用 NSManagedObject 的“setValueForKey”方法。也许将其作为错误报告归档?

最佳答案

如果您让 Xcode 6 Beta 3 为您的实体创建 Swift 文件,它将为 CoreData 创建 NSNumber 属性 bool 类型。

enter image description here

不过,您可以只将 Bool 用作 Swift 类型而不是 NSNumber,这对我来说很有效,但无需使用点语法。 它会将 Swift Bool 设置为 NSNumber,这可能会导致点语法中的错误。


要使其显式化,您应该为具有 Boolean 类型的实体中的属性使用类型 NSNumber。然后创建一个计算属性(在 iBook The Swift programming language under Language Guide -> Properties -> Computed Properties 中)返回一个 Swift Bool。所以永远不会真正存储一个 Bool

像这样:

@NSManaged var snack: NSNumber
var isSnack: Bool {
    get {
        return Bool(snack)
    }
    set {
        snack = NSNumber(bool: newValue)
    }
}

当然隐藏其他(NSNumber 属性)会很酷,但请耐心等待,Apple 会在未来实现私有(private)属性。


编辑:

如果您选中创建 skalar 类型 框,它甚至会在自动创建的 Swift 文件中使用 Bool 类型!

所以我认为这是一个错误。

关于ios - swift + 核心数据 : Can not set a Bool on NSManagedObject subclass - Bug?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24333507/

相关文章:

ios - UITableViewCell 无法使用 Swift 动态调整大小

ios - 自定义类 "Cannot find interface declaration"中无法识别 Objective-C 类别方法

ios - NSPredicate execureFetchRequest 不工作 - 可能是由于字符串中的空格

iphone - Apple 的 iPhone SDK 3.0 CoreDataBooks 示例是否已损坏?

objective-c - 如何处理 "too many HTTP redirects"错误

iphone - 核心数据: Mass updates possible?

ios - 更新 firebase 实时数据库 swift 4 中的特定子项

ios - 在自调整单元格中按比例分布的 UIStackView

iphone - NSDictionary 的描述性变量名称

objective-c - UISearchController 搜索栏位置下降 64 点