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

时间:2014-10-05 18:02:31

标签: cocoa core-data swift nsmanagedobject

如果我尝试将存储的属性添加到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...
    }
}

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

1 个答案:

答案 0 :(得分:4)

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

所以正确的问题是:当您将此对象加载到数据存储之外时,您希望Core Data与foobar做什么?


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

您可以通过多种方式解决问题。您可以提供默认值。您可以使值显式解包为选项(使其默认为nil)。您可以使值可选。您可以声明此初始化程序required,以便所有子类都必须实现它。或者,您可以将Thing声明为final,以使其无法进行子类化。