2015-02-11 124 views
5

是否可以將可選通用參數設置爲默認值?Swift函數中可選通用參數的默認值

我試圖做這樣的事情:

func addChannel<T>(name: String, data: T? = nil) -> Channel { 

} 

let myChannel = addChannel("myChannelName") 

但我發現了一個錯誤說

Argument for generic parameter 'T' could not be inferred

難道只是我想要的情況下做不成?

回答

5

這是不可能的,你已經做到了。只給出上面的代碼,什麼類型是T?正如它所說的,編譯器無法弄清楚(我也不能,也不能假定你不能,因爲數據不在那裏)。

解決的具體問題是超載,而不是使用默認值:

func addChannel<T>(name: String, data: T?) -> Channel { ... } 

func addChannel(name: String) -> Channel { ... } 

let myChannel = addChannel("myChannelName") 

但它提出的你正在做什麼這裏的問題。你會認爲Channel應該是Channel<T>。否則,你在做什麼data?不訴諸Any(你應該避免),很難看到你的功能如何做,但忽略data

隨着Channel<T>你可以只使用一個默認的,但你必須提供類型:

func addChannel<T>(name: String, data: T? = nil) -> Channel<T> { ... } 
let myChannel: Channel<Int> = addChannel("myChannelName") 

否則編譯器會不知道你在做什麼樣的渠道。

+0

好的,這很有道理 - 我只是誤解了如何使用泛型。我的用例是'data'可以是任何類型的Dictionary,Int或String,或者它可以是零。是做這種做'data:AnyObject的首選方法? = nil',然後檢查函數內的數據類型? – hamchapman 2015-02-11 15:46:35

+1

這樣做的首選方法不是「任何類型的Dictionary,Int或String」。確定它是什麼類型。這可能是一個「數據」類型,可能包含任何這些類型。你將它作爲一個帶有關聯數據的枚舉來實現。這樣你就可以確保你收到你期望的東西,而不僅僅是「AnyObject」。當你開始獲得AnyObject?進入你的系統,根據我的經驗,事情會變得非常糟糕。即使對設計問題進行了折扣,編譯器也不喜歡它。 – 2015-02-11 15:47:52

+0

有關Enumerations的更多信息,這些是Swift中的關鍵類型,請參閱https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Enumerations.html。 – 2015-02-11 15:49:56