Ste*_*ton 4 objective-c ios swift
使用 Xcode 7.3 和 Swift 2.2 构建时遇到“init 的使用不明确”错误
该问题与两个 Objective-C 类以及 Swift 如何查看它们的初始值设定项有关。
Objc 看到:
超类
@interface Foo: NSManagedObject
+(instancetype)fooWithOwner:(Owner *)owner insertIntoManagedObjectContext:(NSManagedObjectContext *)context;
Run Code Online (Sandbox Code Playgroud)
子类
@interface Bar: Foo
+(instancetype)barWithOwner:(Owner *)owner insertIntoManagedObjectContext:(NSManagedObjectContext *)context;
Run Code Online (Sandbox Code Playgroud)
而 Swift 只能看到:
init(owner: Owner!, insertIntoManagedObjectContext context: NSManagedObjectContext!)
Run Code Online (Sandbox Code Playgroud)
这导致编译器不确定在子类“Bar”上调用哪个 init。有没有办法指定在初始化子类时使用哪个初始化器?如果可能的话,我想避免重构 init 方法。
这是由于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:));
Run Code Online (Sandbox Code Playgroud)
然后你可以在 Swift 代码中单独调用它们:
let foo = Bar.foo(owner: owner, moc: context)
let bar = Bar.bar(owner: owner, moc: context)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1502 次 |
| 最近记录: |