Swift 支持多个 iOS SDK 版本
Support multiple iOS SDK versions with Swift
在我的代码中,NSManagedObject
有以下扩展名:
extension NSManagedObject {
convenience init(context: NSManagedObjectContext) {
let name = self.dynamicType.entityName()
let entity = NSEntityDescription.entityForName(name, inManagedObjectContext: context)!
self.init(entity: entity, insertIntoManagedObjectContext: context)
}
}
在 Xcode 7 / iOS 9 SDK 中按预期工作。但是,iOS10 SDK增加了一个具有相同签名的方法:
/* Returns a new object, inserted into managedObjectContext. This method is only legal to call on subclasses of NSManagedObject that represent a single entity in the model.
*/
@available(iOS 10.0, *)
public convenience init(context moc: NSManagedObjectContext)
这让编译器不高兴:Initializer 'init(context:)' with Objective-C selector 'initWithContext:' conflicts with previous declaration with the same Objective-C selector
现在,我想使用新的 iOS 10 init(如果可用),如果应用程序在 iOS 9.
的设备上运行,则继续使用我的扩展
有没有一种很好的方法可以在限制现有代码更改的同时实现这一点?我想在扩展中保留 init
的签名。
不幸的是,据我所知,您必须以某种方式更改 init
的签名。不过,这不一定是一个大的变化:
extension NSManagedObject {
convenience init(_ context: NSManagedObjectContext) {
let name = self.dynamicType.entityName()
let entity = NSEntityDescription.entityForName(name, inManagedObjectContext: context)!
self.init(entity: entity, insertIntoManagedObjectContext: context)
}
}
我刚刚删除了 context
的外部参数名称。现在和新加的不冲突了
然后,您可以使用 this question 中描述的方法检查 iOS 版本,并调用正确的初始化程序!
在我的代码中,NSManagedObject
有以下扩展名:
extension NSManagedObject {
convenience init(context: NSManagedObjectContext) {
let name = self.dynamicType.entityName()
let entity = NSEntityDescription.entityForName(name, inManagedObjectContext: context)!
self.init(entity: entity, insertIntoManagedObjectContext: context)
}
}
在 Xcode 7 / iOS 9 SDK 中按预期工作。但是,iOS10 SDK增加了一个具有相同签名的方法:
/* Returns a new object, inserted into managedObjectContext. This method is only legal to call on subclasses of NSManagedObject that represent a single entity in the model.
*/
@available(iOS 10.0, *)
public convenience init(context moc: NSManagedObjectContext)
这让编译器不高兴:Initializer 'init(context:)' with Objective-C selector 'initWithContext:' conflicts with previous declaration with the same Objective-C selector
现在,我想使用新的 iOS 10 init(如果可用),如果应用程序在 iOS 9.
的设备上运行,则继续使用我的扩展有没有一种很好的方法可以在限制现有代码更改的同时实现这一点?我想在扩展中保留 init
的签名。
不幸的是,据我所知,您必须以某种方式更改 init
的签名。不过,这不一定是一个大的变化:
extension NSManagedObject {
convenience init(_ context: NSManagedObjectContext) {
let name = self.dynamicType.entityName()
let entity = NSEntityDescription.entityForName(name, inManagedObjectContext: context)!
self.init(entity: entity, insertIntoManagedObjectContext: context)
}
}
我刚刚删除了 context
的外部参数名称。现在和新加的不冲突了
然后,您可以使用 this question 中描述的方法检查 iOS 版本,并调用正确的初始化程序!