【问题标题】:Ambiguous use of init in Swift 2.2Swift 2.2 中 init 的模糊使用
【发布时间】:2016-07-09 17:57:13
【问题描述】:

在使用 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 方法。

【问题讨论】:

  • 您可以重命名为 makeFooWithOwner...makeBarWithOwner... 或类似名称,但不会将它们转换为初始化程序
  • 您能发布您遇到问题的 Swift 代码吗?我复制/粘贴到一个新项目中,编译没有任何问题。
  • 最初的 Obj-C 方法没有理由应该有不同的名称。

标签: ios objective-c swift


【解决方案1】:

这是由于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)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-27
      • 1970-01-01
      • 1970-01-01
      • 2018-02-23
      • 1970-01-01
      相关资源
      最近更新 更多