Swift 2.2中init的使用不明确

4

当使用Xcode 7.3和Swift 2.2构建时,我遇到了“init使用不明确”的错误。

问题与两个Objective-C类及其初始化方法在Swift中的视图有关。

Objective-C看到的是:

超类

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

子类

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

当 Swift 只看到:

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

这导致编译器无法确定子类"Bar"调用哪个init方法。是否有一种方法在初始化子类时指定要使用的初始化程序?如果可能的话,我想避免重构init方法。


你可以将其重命名为 makeFooWithOwner...makeBarWithOwner... 或类似的名称,这样它就不会将它们转换为初始化器。 - dan
1
你能发布一下你遇到问题的Swift代码吗?我将其复制/粘贴到一个新项目中,编译时没有任何问题。 - Kevin
没有理由让原始的Obj-C方法一开始就有不同的名称。 - Sulthan
2个回答

5
这是由于 ObjC->Swift API翻译规则导致的。
您可以使用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:));

然后你可以在 Swift 代码中单独调用它们:
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;

然后在Swift函数中
我已经尝试了两种方式,都没有问题/接口不匹配
return OBJCObjectFactory.barWithInitializer(className, initializer: initializer, argument: argument) as! TBase?

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

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