如果我尝试将存储的属性添加到Swift中NSManagedObject
的子类中,而不提供默认值(我会在初始化器中执行此操作,请注意),我收到此错误:< / p>
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...
}
}
执行此操作的原因是什么?为什么我不能在初始化器中初始化????
答案 0 :(得分:4)
编辑:以下答案适用于各种各样的情况,并且与此相关,但并不完全解决NSManagedObject
情况。在NSManagedObject
的情况下,可以从持久性存储中加载对象并初始化,而无需调用特殊的init。在这些情况下,Swift不知道它应该分配foo
和bar
的内容,因此需要一些默认值(而不是仅使用final
或required
在其他子类化情况下做的事情)。
所以正确的问题是:当您将此对象加载到数据存储之外时,您希望Core Data与foo
和bar
做什么?
因为编译器无法证明所有子类都将实现或调用init(foo,bar)
。如果子类未实现该初始化程序,则可能无法初始化foo
或bar
。
您可以通过多种方式解决问题。您可以提供默认值。您可以使值显式解包为选项(使其默认为nil
)。您可以使值可选。您可以声明此初始化程序required
,以便所有子类都必须实现它。或者,您可以将Thing
声明为final
,以使其无法进行子类化。