使用Swift支持多个iOS SDK版本

时间:2016-09-23 12:08:27

标签: ios swift core-data ios10

在我的代码中,我对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 9设备上运行,我想使用新的iOS 10 init(如果可用)并继续使用我的扩展程序。

如何在限制现有代码更改的同时实现这一目标有一个很好的方法吗?我想在扩展程序中保留init的签名。

1 个答案:

答案 0 :(得分:1)

不幸的是,就我而言,您必须以这种或那种方式更改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版本,并调用正确的初始化程序!