2016-09-19 98 views
2

我有一个协议,在objc看起来像:雨燕3.0版本方法

@protocol TestProtocol 
- (void)releaseProtocol; 
@end 

雨燕3.0自动将其转换成

protocol TestProtocol { 
    func release() 
} 

但是,这带来一个问题,因为如果我有一类编译器会从NSObject继承,因为协议中的release()与NSObjectProtocol中的release()相冲突。

class TestClass: TestProtocol, NSObject 
{ 
    func release() { #[email protected]#.! } // Compiler error 
} 

此时,我无法更改源协议,因为它在SDK中,我无法修改。

有没有办法告诉swift编译器将其转换为不同的名称,或指定方法fooRelease()对应于TestProtocol.release()方法?

回答

1

该协议的Objective-C声明必须更改。如果你不能自己改变它,我建议你向作者发出pull请求,要求他们使用NS_SWIFT_NAME来允许Swift的互操作性。您可能不是唯一使用此SDK的人会遇到此问题。

因此,应该声明是这样的:

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

本名并不坏,只是做简单的提问。无论如何,ObjC名字将来会改变,实际上我维护原来的SDK。但是我想知道是否有一种方法可以在不发布新版SDK的情况下克服这种转换。 – HyLian

+0

我们都讨厌向公共API分发非向后兼容的更改,但是您可能需要咬紧牙关。另外,这不会影响Swift 3用户吗?而且,由于这对于Swift 3用户使用基于NSObject的类无效,所以Swift 3的用户群在他们的基于非'NSObject'的类中实现'release()'有多大。 .. – Rob