【问题标题】:Is there a way to fetch class name as a String in designated initializer有没有办法在指定的初始化程序中获取类名作为字符串
【发布时间】:2016-02-03 11:58:05
【问题描述】:

在调用 super.init 之前,有什么方法可以在 init 中将类名作为 String 获取

我想为 NSManagedObject 的子类创建 init 方法,所以我不需要每次都创建实体。这个 CoreDataManagedObject 是一个抽象类,我所有的 ManagedObject 都需要从它继承。现在如何将 init() 中的 className 作为字符串获取?

class CoreDataManagedObject: NSManagedObject {

  init() {
    let entityName = <get class name here as a String>
    let entity = NSEntityDescription.entityForName(entityName, inManagedObjectContext: coreDataStack.context)!
    super.init(entity: entity, insertIntoManagedObjectContext: coreDataStack.context)
  }
}

class Company: CoreDataManagedObject {
}

我不能在 super.init 之前使用 self ,所以我想知道 init() 中是否有另一种方法来获取要创建哪个对象的信息。如果我正在创建 Company 对象,我只想创建 entityName = "Company"。

【问题讨论】:

  • 肯定有一些解决方案,阻止你在 super.init 之前使用类名,但如果你想这样做,其中一种解决方案可以是在你的任何类中都有一个带有 className 的属性拥有,然后从 init 访问它: class CoreDataManagedObject: NSManagedObject { var name = "CoreDataManagedObject" init() { let entityName = name } } class Company: CoreDataManagedObject { var nameN = "Company" override var name: String { get { return nameN } 设置 { nameN = newValue } } }

标签: initialization swift2


【解决方案1】:

您可以使用协议来执行此操作,但您必须将其添加到所有实体类中:

protocol CoreEntityClass 
{
   init(forEntity:String)
}

extension CoreEntityClass
{
   init() 
   {
     self = Self(forEntity:"\(Self.self)")
   }
}

class CoreDataManagedObject:NSManagedObject
{   
   required init(forEntity entityName:String)
   {
     let entity = NSEntityDescription.entityForName(entityName, inManagedObjectContext: coreDataStack.context)!
     super.init(entity: entity, insertIntoManagedObjectContext: coreDataStack.context)
   }
}


class Company:CoreDataManagedObject, CoreEntityClass 
{
  //...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多