2016-03-22 46 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?