在Swift 2.2中模糊地使用init

时间:2016-03-22 17:29:54

标签: ios objective-c swift

使用Xcode 7.3和Swift 2.2进行构建时出现“模糊使用init”错误

该问题与两个Objective-C类以及Swift如何查看其初始化器有关。

Objc看到:

超类

@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方法。

2 个答案:

答案 0 :(得分: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:));

然后你可以在Swift代码中单独调用它们:

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

答案 1 :(得分: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?