2016-09-23 60 views
3

在我的代碼,我有NSManagedObject以下擴展名:支持多種的iOS SDK版本的雨燕

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/9的iOS 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的init(如果可用),並繼續使用我的如果應用程序在iOS 9設備上運行,則爲擴展名。

如何在限制現有代碼中的變化的情況下實現此目標有一個很好的方法嗎?我想將init的簽名保留在擴展名中。

回答

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版本,然後調用正確的初始化程序!