gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 10:25:47 24 4
gpt4 key购买 nike

如果我尝试在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com