首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Swift支持多个iOS SDK版本

使用Swift支持多个iOS SDK版本
EN

Stack Overflow用户
提问于 2016-09-23 12:08:27
回答 1查看 423关注 0票数 3

在我的代码中,我为NSManagedObject提供了以下扩展

代码语言:javascript
复制
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添加了一个具有相同签名的方法:

代码语言:javascript
复制
/* 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的签名。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-23 12:33:46

不幸的是,就我而言,您必须以某种方式更改您的init的签名。不过,这并不一定是一个很大的变化:

代码语言:javascript
复制
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中描述的方法检查this question版本,并调用正确的初始化器!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39660427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档