2016-03-22 44 views
3

在Xcode 7.3和2.2雨燕曖昧使用的初始化的2.2

問題涉及兩個Objective-C類和斯威夫特是如何看待自己的初始化建立時,我得到一個「曖昧使用的初始化」錯誤。

Objc認爲:

超類

@interface Foo: NSManagedObject 
+(instancetype)fooWithOwner:(Owner *)owner insertIntoManagedObjectContext:(NSManagedObjectContext *)context; 

子類

@interface Bar: Foo 
+(instancetype)barWithOwner:(Owner *)owner insertIntoManagedObjectContext:(NSManagedObjectContext *)context; 

而斯威夫特只看到:

init(owner: Owner!, insertIntoManagedObjectContext context: NSManagedObjectContext!) 

這導致編譯器不確定在子類「Bar」上調用哪個init。有沒有一種方法來指定初始化子類時使用哪個初始化器?如果可能的話,我想避免重構init方法。

+0

可以重命名爲'makeFooWithOwner ...'和'makeBarWithOwner ...'或者類似的東西,它不會將它們轉換初始化器 – dan

+1

你能發佈你遇到問題的Swift代碼嗎?我複製/粘貼到一個新的項目,並沒有任何麻煩編譯。 – Kevin

+0

沒有理由爲什麼最初的Obj-C方法首先應該有不同的名稱。 – Sulthan

回答

4

正是由於ObjC->Swift API translation rules。可以使用swift_name屬性來覆蓋這些規則。

@interface Foo: NSManagedObject 
+(instancetype)fooWithOwner:(Owner *)owner insertIntoManagedObjectContext:(NSManagedObjectContext *)context NS_SWIFT_NAME(foo(owner:moc:)); 

@interface Bar: Foo 
+(instancetype)barWithOwner:(Owner *)owner insertIntoManagedObjectContext:(NSManagedObjectContext *)context NS_SWIFT_NAME(bar(owner:moc:)); 

然後你就可以在銀行代碼分別打電話給他們:

let foo = Bar.foo(owner: owner, moc: context) 
let bar = Bar.bar(owner: owner, moc: context) 
0

我不知道發生了什麼事,順便說一句我試過這個。在ObjC頭我加入這兩個類方法:

+ (id)barWithInitializer:(NSString *)className 
initializer:(SEL)initializer 
    argument:(id)argument; 

+ (id)fooWithInitializer:(NSString *)className 
       initializer:(SEL)initializer 
        argument:(id)argument; 

然後在斯威夫特功能

我曾經嘗試都沒有問題/接口不匹配

return OBJCObjectFactory.barWithInitializer(className, initializer: initializer, argument: argument) as! TBase? 

return OBJCObjectFactory.fooWithInitializer(className, initializer: initializer, argument: argument) as! TBase?