2016-11-27 3 views
4

Ich versuche, meine eigene Version von convenience init(context moc: NSManagedObjectContext), die neue Bequemlichkeit initialiser auf NSManagedObject in iOS 10. Grund zu implementieren ist, ich es mit iOS 9.Get Klassennamen in Bequemlichkeit init Swift 3

I kompatibel zu machen brauchen, um habe mit dieser kommen:

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) 
} 

aber nicht wegen dieses Fehlers funktioniert ...

'selbst' verwendet, bevor self.init Anruf

Kann jemand diesen Fehler umgehen, oder das gleiche Ergebnis auf eine andere Weise erreichen.

Antwort

4

Sie können die Art von self mit type(of: self) bekommen und dass funktioniert sogar vor self initialisiert wird. String(describing: <type>) gibt die uneingeschränkten Typnamen als Zeichenfolge (dh den Typnamen ohne die Modulnamen), und das ist genau das, was brauchen Sie hier:

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) 
    } 
} 

Sie auch eine if #available Prüfung hinzufügen kann die neues verwenden init(context:) initializer auf iOS 10/macOS 10.12 oder höher und der Kompatibilitätscode als Ausweich auf älteren OS-Versionen:

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

das ist perfekt. Vielen Dank. –

Verwandte Themen