【问题标题】:Inheritance when initialising NSManagedObject subclass初始化 NSManagedObject 子类时的继承
【发布时间】:2015-02-09 23:05:08
【问题描述】:

假设我有一个名为MyObjectNSManagedObject 的子类和一个名为User 的子类。

每个子类都有一个名为class func createInManagedObjectContext(managedObjectContext: NSManagedObjectContext, propertiesDictionary: NSDictionary) -> User/MyObject? 的特定插入方法,它本身使用NSEntityDescription.insertNewObjectForEntityForName 方法插入一个新实体。

如何正确使用继承来设置User 对象中的MyObject 属性?

我是否应该在User 方法中创建一个新的MyObject,从这个新对象中设置User 属性,然后删除MyObject 这样它就不会被保存?还是我想在这里重新发明轮子?

更新代码:

class func createInManagedObjectContext(managedObjectContext: NSManagedObjectContext, propertiesDictionary: NSDictionary) -> MyObject?
{
    let newObject = NSEntityDescription.insertNewObjectForEntityForName("MyObject", inManagedObjectContext: managedObjectContext) as MyObject

    newObject.property = propertiesDictionary[“property”]
}




override class func createInManagedObjectContext(managedObjectContext: NSManagedObjectContext, propertiesDictionary: NSDictionary) -> User?
{
    let newObject = NSEntityDescription.insertNewObjectForEntityForName("User", inManagedObjectContext: managedObjectContext) as User

    newObject.name = propertiesDictionary[“name”]
}

这就是我的代码结构。但是,当我在 User 上调用 createInManagedObjectContext 时,尽管使用了 override 关键字,但 MyObject 中的属性“property”并未设置。我错过了什么?

谢谢

【问题讨论】:

    标签: ios swift inheritance core-data


    【解决方案1】:

    所以我通过添加label 属性并调用相关超类的方法传递标签来解决此问题。

    【讨论】:

      【解决方案2】:

      如果UserMyObject 的子类,那么User 的任何实例都是 也是MyObject 的实例。由于User 继承自MyObject,所有User 实例都具有在MyObject 上定义的所有属性。

      因此,您创建User 的实例,然后设置其所有属性,包括为MyObject 定义的属性。您无需创建两个实例即可使用继承。

      更新,基于代码sn-p:

      您的createInManagedObjectContext 是一个自定义方法。除非您调用它,否则它不会被调用。如果您在User 上调用此方法,则没有理由自动调用MyObject 版本。因此,调用 User 上的方法不会在该代码中设置 property

      但是,由于User也是MyObject的实例,您不需要调用该方法来设置property的值。您可以将User 版本重写为如下所示:

      override class func createInManagedObjectContext(managedObjectContext: NSManagedObjectContext, propertiesDictionary: NSDictionary) -> User?
      {
          let newObject = NSEntityDescription.insertNewObjectForEntityForName("User", inManagedObjectContext: managedObjectContext) as User
      
          newObject.property = propertiesDictionary[“property”]
          newObject.name = propertiesDictionary[“name”]
      }
      

      【讨论】:

      • 我认为我的困惑在于insertNewObjectForEntityForName 方法。由于两个自定义初始化程序都使用此方法,因此我假设/认为两个对象将被插入
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多