2016-11-27 77 views
4

我想實現我自己的convenience init(context moc: NSManagedObjectContext)版本,在iOS中10原因上NSManagedObject新的便利初始化器是我需要使它與iOS兼容9獲取類名的init斯威夫特3

我「已經想出了這一點:

convenience init(managedObjectContext moc: NSManagedObjectContext) { 
    let name = "\(self)".components(separatedBy: ".").first ?? "" 

    guard let entityDescription = NSEntityDescription.entity(forEntityName: name, in: moc) else { 
     fatalError("Unable to create entity description with \(name)") 
    } 

    self.init(entity: entityDescription, insertInto: moc) 
} 

,但它並沒有因爲這個錯誤的工作...

'self.init調用之前使用自我'

有誰知道如何解決這個錯誤,或以另一種方式實現相同的結果。

回答

4

您可以使用type(of: self)獲得self的類型,並且即使在初始化self之前 也可以工作。 String(describing: <type>)返回不合格的類型名稱爲 字符串(即沒有模塊名稱類型名稱),這是 正是你需要的位置:

extension NSManagedObject { 
    convenience init(managedObjectContext moc: NSManagedObjectContext) { 
     let name = String(describing: type(of: self)) 

     guard let entityDescription = NSEntityDescription.entity(forEntityName: name, in: moc) else { 
      fatalError("Unable to create entity description with \(name)") 
     } 

     self.init(entity: entityDescription, insertInto: moc) 
    } 
} 

您還可以添加if #available檢查,以使用新init(context:)初始化iOS上10/MACOS 10.12或更高版本,並作爲備用對舊的OS版本兼容性代碼 :

extension NSManagedObject { 
    convenience init(managedObjectContext moc: NSManagedObjectContext) { 
     if #available(iOS 10.0, macOS 10.12, *) { 
      self.init(context: moc) 
     } else { 
      let name = String(describing: type(of: self)) 
      guard let entityDescription = NSEntityDescription.entity(forEntityName: name, in: moc) else { 
       fatalError("Unable to create entity description with \(name)") 
      } 
      self.init(entity: entityDescription, insertInto: moc) 
     } 
    } 
} 
+0

這是完美的。謝謝。 –