2015-12-15 67 views
9

比方說,我有這樣的代碼:我可以限制一個泛型參數*不*可選嗎?

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> 
+3

我對要求不太清楚。什麼樣的函數可以「根本不需要任何限制」,除了一個特定的枚舉被稱爲可選?可選有一點語言魔力,但大多數情況下,它只是一個枚舉類型。我的懷疑是,你真正想做的是創建一個協議,你可以附加到你接受的類型上,而不是「任何東西,但可選」。 –

+0

「幾乎沒有任何限制,除了一個名爲Optional的特定枚舉」幾乎完全是我想要的(或者更確切地說,除了'nil'之外的任何內容)。我在猜測,當你這樣說時,如果沒有某種依賴類型是不可能的,但是想限制一個類型只保留特定值,這對我來說就是一個非常常見的用例。 – rogueleaderr

+0

目前還不清楚你的函數如何處理「除零以外的任何值」。它有什麼作用?零在Swift中並不是很神奇。這是一個合法的值('Optional.None')。它不是0或NULL或類似的東西。您可以一般地使用nil,就像您可以使用任何其他枚舉值一樣。它本身並不像其他語言那樣危險。 –

回答

5

我能想到的最好的是超載和在運行時檢查:

func hello<T>(thing: T) -> String { 
    return "hello \(thing)" 
} 

fun hello<T>(thing: T?) -> String { 
    fatalError("No optionals allowed!") 
} 

hello("swift") // fine 
hello(2)  // fine 
hello(Int("2")) // fatal error 

但我不知道發生的一種方式代之以編譯時錯誤。

1

編輯

您可以創建一個虛擬的協議(以下NotOfOptionalType),並延長你期望通過該協議在您的泛型函數中使用的所有類型。最後,使用虛擬協議作爲泛型函數中參數的類型約束; optionals不符合此類型約束,並且如果它們作爲這些函數的參數發送,則會在編譯時給出錯誤。

// dummy protocol 
protocol NotOfOptionalType {} 

extension String : NotOfOptionalType {} 
extension Int : NotOfOptionalType {} 
extension Double : NotOfOptionalType {} 
// ... extend to the types you will use 

func hello<T: NotOfOptionalType > (thing: T) -> String { 
    return "hello \(thing)" 
} 

let foo = "some" 
var bar: String? = nil 

print(hello(foo)) // compiles 
print(hello(bar)) // fails at compile time 
bar = "something" 
print(hello(bar)) // fails at compile time 
print(hello(bar!)) // compiles 
+0

我喜歡這個想法,但我只是試了一下,你好(酒吧)沒有編譯,但在*運行時強制轉換失敗*沒有編譯時間,所以它並不妨礙程序員'self.shootFoot()'我希望能夠編譯。 – rogueleaderr

+0

編輯答案:希望這會爲你工作。 – dfri

相關問題