2016-07-08 35 views
0

我們正在將現有類從Objective-C遷移到Swift。在一個視圖控制器類中,我正在實現一個協議,並試圖添加視圖控制器作爲其中包含的對象的代表。當我嘗試添加「自我」爲對象的斯威夫特委託我得到以下編譯錯誤:Objective-C協議在Swift中未被識別

Cannot call value of non-function type '((ListenerProtocol) -> Void)? 

這裏是的OBJ-C

@interface SomeViewController : UIViewController <ListenerProtocol> ... 

現有實現並添加類作爲聽衆(代表)

[manager addListener:self]; 

這個工作沒有任何問題。但Swift版本看起來像是相同的代碼。這裏是斯威夫特版相同的呼叫:

@objc class SomeSwiftViewController: UIViewController, ListenerProtocol ... 

並調用「的addListener」

manager?.addListener(self) 

我已經通過檢查成功的是「自我」是在運行時ListenerProtocol對象驗證:

if self.conformsToProtocol(ListenerProtocol){ 
    // ... 
} 

在包含委託屬性的對象中,addListener方法在Objective-C中定義如下:

- (void)addListener:(id<ListenerProtocol>)listener { 
    // ... 
} 

Swift類完全實現了ListenerProtocol中定義的所有方法。我不明白爲什麼這在Swift中不起作用。任何人都可以提出建議嗎?謝謝!

+0

你可以顯示'manager.addListener'的定義? –

回答

2

問題不在於ListenerProtocol,它與manager實現的協議一致。根據類型判斷,addListener似乎是作爲可選方法提供的。注意問號在功能類型的末尾:

((ListenerProtocol) -> Void)? 

這通常發生與(實際上,我認爲這只是發生),Objective-C的任擇議定書方法。您可以編寫manager?.addListener?(self)manager?.addListener!(self)

+0

我想你的意思是「'addListener'似乎是作爲一個可選方法提供的」(不是addManager)。另一種可能性是'addListener'是管理器上的可選屬性。 –