比方說,我有這樣的代碼:我可以限制一個泛型參數*不*可選嗎?
func hello<T>(thing: T) -> String {
return "hello \(thing)"
}
我可以寫一個版本的hello
功能,如果它通過一個可選的,將無法編譯的?
let foo = "some"
let bar: String? = nil
print(helloNoOptional(foo)) // should compile
print(helloNoOptional(bar)) // should not compile
我想,也許這是可行的與協議一致性或where
條款對T,但我想不出究竟會工作。
我想這樣做的原因是因爲我正在處理遺留代碼庫中的實際功能,如果thing
爲零,則沒有明顯的行爲。因此,我寧願阻止hello
被選中,而不是在打開thing
以解決問題,並試圖找出明智的錯誤行爲。
更新:
一條可行的途徑......我意識到,可選枚舉符合NilLiteralConvertible
協議。因此,如果我可以找到一種方法來將我的泛型限制爲而不是符合某種類型,我可以事實上排除選項。但我不知道是否有可能像做
<T where !T: NilLiteralConvertible>
我對要求不太清楚。什麼樣的函數可以「根本不需要任何限制」,除了一個特定的枚舉被稱爲可選?可選有一點語言魔力,但大多數情況下,它只是一個枚舉類型。我的懷疑是,你真正想做的是創建一個協議,你可以附加到你接受的類型上,而不是「任何東西,但可選」。 –
「幾乎沒有任何限制,除了一個名爲Optional的特定枚舉」幾乎完全是我想要的(或者更確切地說,除了'nil'之外的任何內容)。我在猜測,當你這樣說時,如果沒有某種依賴類型是不可能的,但是想限制一個類型只保留特定值,這對我來說就是一個非常常見的用例。 – rogueleaderr
目前還不清楚你的函數如何處理「除零以外的任何值」。它有什麼作用?零在Swift中並不是很神奇。這是一個合法的值('Optional.None')。它不是0或NULL或類似的東西。您可以一般地使用nil,就像您可以使用任何其他枚舉值一樣。它本身並不像其他語言那樣危險。 –