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

Posted

技术标签:

【中文标题】在 Swift 中将存储属性添加到 NSManagedObject 的子类【英文标题】:Adding a stored property to a subclass of NSManagedObject in Swift 【发布时间】:2014-10-05 18:02:30 【问题描述】:

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

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

【问题讨论】:

你可以使用 transient properties 来达到这个目的。瞬态属性不会保存到持久存储中,但 Xcode 会创建相应的 Swift 属性,Core Data 运行时会创建必要的访问器方法。 – 另请注意,您必须使用指定的初始化程序 init(entity entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext!) 创建托管对象。 【参考方案1】:

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

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


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

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

【讨论】:

为什么只有当它是 NSManagedObject 的子类时才会发生这种情况?如果我删除声明中的超类,它编译得很好。

以上是关于在 Swift 中将存储属性添加到 NSManagedObject 的子类的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中将实例变量的属性保存到 Struct 的静态变量数组中

如何在 Swift 中将键值对添加到类型为 [String:AnyObject] 的字典中?

在 Swift 中将文本字段添加到 UILocalNotification

如何在swift中将逗号添加到数字?

在 swift 中将 Facebook 电子邮件存储在解析用户表中

如何在 Swift 3 中将图像添加到 UIAlertbox?