cocoa - 在 Swift 中将存储属性添加到 NSManagedObject 的子类

标签 cocoa core-data swift nsmanagedobject

如果我尝试在 Swift 中向 NSManagedObject 中的子类添加一个存储属性,而不为其提供默认值(请注意,我会在初始化程序中这样做),我得到这个错误:

Stored property 'foo' requires an initial value or should be @NSManaged

代码如下:

class Thing : NSManagedObject{
    var foo : String
    var bar : String

    init(foo: String, bar : String){

        // blah, blah...
    }
}

强制执行此操作的原因是什么?为什么我不能在初始化程序中初始化????

最佳答案

编辑:下面的答案适用于多种情况,并且与此相关,但并不完全解决 NSManagedObject 情况。在 NSManagedObject 的情况下,一个对象可以从持久存储中加载并初始化,而无需调用您的特殊 init。 Swift 不知道在这些情况下应该为 foobar 分配什么,因此需要一些默认值(而不是仅仅使用 finalrequired 就像你在其他子类情况下所做的那样)。

所以正确的问题是:当 Core Data 从数据存储中加载这个对象时,您希望 Core Data 对 foobar 做什么?


因为编译器无法证明所有的子类都会实现或调用init(foo,bar)。如果子类没有实现该初始化器,则 foobar 可能不会被初始化。

您可以通过多种方式解决这个问题。您可以提供默认值。您可以使这些值显式展开可选值(使其成为默认的 nil)。您可以使值可选。您可以将此初始化程序声明为required,以便所有子类都必须实现它。或者您可以将 Thing 声明为 final,这样它就不能被子类化。

关于cocoa - 在 Swift 中将存储属性添加到 NSManagedObject 的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26205606/

相关文章:

macos - 当表为空时,如何确定 NSTableView 中给定列的 NSTableCellView ?

objective-c - NSTimer的内存管理——是否需要分配给变量?

objective-c - main() 中的 EXC_BAD_ACCESS

objective-c - 如何拥有不同的 NSManagedObjectContext?

cocoa - NSImage 鼠标事件

ios - 从集合中删除对象会使 CoreData 中的逆关系无效

sqlite - 核心数据轻量级迁移 : what's required to trigger it?

arrays - Swift 相当于 Ruby 的 "each_cons"

ios - 在应用程序中收到通知时,PFInstallation 不是最新的

ios - 在 NSUserDefaults 中存储字典并使用存储的数据。