Swift 3.0 发布方法

3

我有一个类似这样的Objective-C协议:

@protocol TestProtocol
- (void)releaseProtocol;
@end

Swift 3.0会自动将其转换为

protocol TestProtocol {
    func release()
}

然而这会引起一个问题,因为如果我有一个继承自NSObject的类,编译器就会抱怨,因为协议中的release()与NSObjectProtocol中的release()发生了冲突。

class TestClass: TestProtocol, NSObject 
{   
   func release() { #?@#.! }  // Compiler error
}

当前,由于SDK不可修改,我无法更改源协议。

是否有一种方法可以告诉Swift编译器将其转换为不同的名称,或指定fooRelease()方法对应于TestProtocol.release()方法?

1个回答

2

该协议的Objective-C声明必须更改。如果您无法自行更改,请建议您向作者发出拉取请求,要求他们使用 NS_SWIFT_NAME 以允许Swift互操作性。您可能不是唯一遇到此问题的使用此SDK的人。

因此,它应该声明为:

@protocol TestProtocol
- (void)releaseProtocol NS_SWIFT_NAME(releaseProtocol());
@end

1
真实名称并不那么糟糕,只是为了问题简化了一下。无论如何,ObjC的名称将来会改变,实际上我正在维护原始的SDK。但我想知道是否有办法在不发布新版SDK的情况下克服这个转换问题。 - HyLian
我们都不喜欢向公共API发布不向后兼容的更改,但你可能需要在这个问题上咬紧牙关。此外,这难道不只会影响Swift 3用户吗?而且,由于这对于基于NSObject类的Swift 3用户无效,这取决于你的Swift 3用户群体中有多少人已经在他们的非NSObject类中实现了release()方法... - Rob

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