在easy init Swift 3中获取类名

时间:2016-11-27 00:25:43

标签: ios swift core-data nsmanagedobject initializer

我正在尝试实现我自己的convenience init(context moc: NSManagedObjectContext)版本,这是iOS 10中NSManagedObject上的新便捷初始化程序。原因是我需要使其与iOS 9兼容。

我想出了这个:

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 call之前使用

有没有人知道如何解决此错误,或以其他方式实现相同的结果。

1 个答案:

答案 0 :(得分:7)

您可以使用self获取type(of: self)的类型 甚至在self初始化之前就可以工作了。 String(describing: <type>)将非限定类型名称作为a返回 字符串(即没有模块名称的类型名称),即 正是你需要的:

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检查以在iOS 10 / macOS 10.12或更高版本上使用新的init(context:)初始化程序,以及兼容性代码 作为旧操作系统版本的后备:

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