2016-11-27 2 views
4

Я пытаюсь реализовать свою собственную версию convenience init(context moc: NSManagedObjectContext), новое удобство инициализатора на NSManagedObject в IOS 10. Причина в том, мне нужно, чтобы сделать его совместимым с прошивкой 9.Получить имя класса в удобстве инициализации Swift 3

I «ве придумали это:

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

Вы можете получить тип self с type(of: 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:) инициализатор на прошивке 10/MacOS 10.12 или более поздней версии, а код совместимости в качестве запасного варианта на старых версии ОС:

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

Это идеальный вариант. Спасибо. –

Смежные вопросы