2016-09-19 134 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