使用Swift支持多个iOS SDK版本

3

在我的代码中,我为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的签名。

1个回答

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版本,并调用正确的初始化程序!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接