在 convenience init Swift 3 中获取 class 名称
Get class name in convenience init Swift 3
我正在尝试实现我自己的 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' used before self.init call
有谁知道如何解决这个错误,或者以其他方式获得相同的结果。
你可以用 type(of: self)
得到 self
的类型
甚至在 self
初始化之前就可以工作。
String(describing: <type>)
returns 非限定类型名称作为
字符串(即不带模块名称的类型名称),即
正是您在这里需要的:
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:)
初始值设定项,以及兼容性代码
作为旧 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)
}
}
}
我正在尝试实现我自己的 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' used before self.init call
有谁知道如何解决这个错误,或者以其他方式获得相同的结果。
你可以用 type(of: self)
得到 self
的类型
甚至在 self
初始化之前就可以工作。
String(describing: <type>)
returns 非限定类型名称作为
字符串(即不带模块名称的类型名称),即
正是您在这里需要的:
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:)
初始值设定项,以及兼容性代码
作为旧 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)
}
}
}