2016-02-29 84 views
3

也許這是一個愚蠢的問題,但我找不到任何解決辦法呢。所以,我的問題是,是有這樣的功能的事件發射協議:迅速閉合不能覆蓋任何

mutating func on(eventName:String, action:((Any?)->())) { 
    //.. 
} 

而且我想使用它,每當一個事件被觸發了一些信息,告知聽衆。 例如,用於「登錄」事件的訪問令牌。

appSessionHadler.on("login") { (weak data: String?) in 
    //... 
} 

而且比我得到一個錯誤,我不能援引「上的」使用類型是參數列表。當然,它適用於任何:

appSessionHadler.on("login") { (weak data: Any?) in 
    //... 
} 

一切符合任何,所以我是一個,但困惑。有人可以解釋這一點,請!

我可以用一個通用的協議解決這個問題,但它仍然讓我很沮喪,它不喜歡這個作品。

回答

2

你正在做一個承諾,編譯器無法保持。 on函數可以隨意調用action以及任何類型的數據。但是您傳遞的函數只接受String。什麼是應該做的,如果on包括下面的代碼(直接或間接)系統:

action(1) 

1不是String,所以類型安全將被打破。編譯器不能讓你這樣做。

另一種方式來思考這是on需要F類型的函數,你傳遞一個超的F而非亞型FStringAny的子類型。但功能參數以相反的順序工作。 (String)->Void(Any)->Void的超類型。因此,這是與傳遞Any類型的變量到需要String的功能。從形式上講,我們認爲函數在參數上是逆變的,在返回值中是協變的。你可以閱讀Type Variance in Swift

當你懷疑,仿製藥是這裏的正確答案。 Any幾乎總是錯誤的工具。而且Any?是Swift中使用最困難的類型之一,所以我絕對會不惜一切代價避免使用這個類型。 (Optional本身就是Any一個亞型,而斯威夫特具有自動晉升爲Optional,所以當你有Any?開始越來越雙選配更糟的是很常見的。)

+0

非常感謝,我思前想這是完全清楚後: )現在,它的工作,如:'變異對 FUNC(:字符串,動作:eventName的?((T) - >()))' – gujci