Ios Swift 2.2中init的用法不明确

Ios Swift 2.2中init的用法不明确,ios,objective-c,swift,Ios,Objective C,Swift,在使用Xcode 7.3和Swift 2.2构建时,我遇到了一个“不明确地使用init”错误 这个问题与两个Objective-C类以及Swift如何看待它们的初始值设定者有关 Objc看到: 超类 子类 而斯威夫特只看到: init(owner: Owner!, insertIntoManagedObjectContext context: NSManagedObjectContext!) 这导致编译器不确定在子类“Bar”上调用哪个init。有没有办法指定初始化子类时使用哪个初始值设定项?

在使用Xcode 7.3和Swift 2.2构建时,我遇到了一个“不明确地使用init”错误

这个问题与两个Objective-C类以及Swift如何看待它们的初始值设定者有关

Objc看到:

超类

子类

而斯威夫特只看到:

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

这导致编译器不确定在子类“Bar”上调用哪个init。有没有办法指定初始化子类时使用哪个初始值设定项?如果可能的话,我希望避免重构init方法。

我不确定发生了什么,顺便说一句,我尝试了这个。在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?
这是由于

您可以使用
swift\u 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)

您可以重命名为
makeFooWithOwner…
makeBarWithOwner…
或类似名称,但不会将其转换为初始值设定项。您可以发布您遇到问题的Swift代码吗?我复制/粘贴到一个新项目中,在编译时没有遇到任何问题。最初没有理由让原始Obj-C方法有不同的名称。
@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)