如果我尝试在 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 不知道在这些情况下应该为 foo
和 bar
分配什么,因此需要一些默认值(而不是仅仅使用 final
或 required
就像你在其他子类情况下所做的那样)。
所以正确的问题是:当 Core Data 从数据存储中加载这个对象时,您希望 Core Data 对 foo
和 bar
做什么?
因为编译器无法证明所有的子类都会实现或调用init(foo,bar)
。如果子类没有实现该初始化器,则 foo
或 bar
可能不会被初始化。
您可以通过多种方式解决这个问题。您可以提供默认值。您可以使这些值显式展开可选值(使其成为默认的 nil
)。您可以使值可选。您可以将此初始化程序声明为required
,以便所有子类都必须实现它。或者您可以将 Thing
声明为 final
,这样它就不能被子类化。
关于cocoa - 在 Swift 中将存储属性添加到 NSManagedObject 的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26205606/