使用Swift支持多个iOS SDK版本

汤姆·克雷纳

在我的代码中,我具有以下扩展名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中按预期运行。但是,iOS 10 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初始化(如果可用),如果应用程序在装有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现在,它与新添加的冲突了。

然后,您可以使用此问题中所述的方法检查iOS版本,然后调用正确的初始化程序!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章