在 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 不知道在这些情况下它应该分配什么 foo
和 bar
,因此需要一些默认值(而不是像在其他子类化情况下那样只使用 final
或 required
)。
所以正确的问题是:当 Core Data 从数据存储中加载这个对象时,你希望 Core Data 对 foo
和 bar
做什么?
因为编译器无法证明所有子类都会实现或调用init(foo,bar)
。如果子类没有实现该初始化器,则 foo
或 bar
可能不会被初始化。
您可以通过多种方式解决此问题。您可以提供默认值。您可以使这些值显式地展开可选选项(使其默认为nil
)。您可以将这些值设为可选。您可以声明此初始化程序required
,以便所有子类都必须实现它。或者您可以将Thing
声明为final
,这样它就不能被子类化。
【讨论】:
为什么只有当它是 NSManagedObject 的子类时才会发生这种情况?如果我删除声明中的超类,它编译得很好。以上是关于在 Swift 中将存储属性添加到 NSManagedObject 的子类的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 中将实例变量的属性保存到 Struct 的静态变量数组中
如何在 Swift 中将键值对添加到类型为 [String:AnyObject] 的字典中?
在 Swift 中将文本字段添加到 UILocalNotification