-
swapTwoValues(_:_:)函數(shù)和Stack類型可以用于任意類型. 但是, 有時(shí)在用于泛型函數(shù)的類型和泛型類型上, 強(qiáng)制其遵循特定的類型約束很有用. 類型約束指出一個(gè)類型形式參數(shù)必須繼承自特定類, 或者遵循一個(gè)特定的協(xié)議、組合協(xié)議. - 例如,
Swift的Dictionary類型在可以用于字典中鍵的類型上設(shè)置了一個(gè)限制. 如字典中描述的一樣,字典鍵的類型必須是可哈希的. 也就是說, 它必須提供一個(gè)使其可以唯一表示的方法.Dictionary需要它的鍵是可哈希的, 以便它可以檢查字典中是否包含一個(gè)特定建的值. 沒有了這個(gè)要求,Dictionary不能區(qū)分該插入還是替換一個(gè)指定鍵的值, 也不能在字典中查找已經(jīng)給定的鍵的值.
類型約束語法
- 在一個(gè)類型形式參數(shù)名稱后面放置一個(gè)類或者協(xié)議作為形式參數(shù)列表的一部分, 并用冒號(hào)隔開, 以寫出一個(gè)類型約束.
下面展示了一個(gè)泛型函數(shù)類型約束的基本語法(和泛型類型的語法相同)
func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, SomeU: U) {
// function body goes here
}
類型約束的應(yīng)用
一個(gè)叫做findIndex(ofString:in:)的非泛型函數(shù), 在給定的String值數(shù)組中查找給定的String值, findIndex(ofString:in:)函數(shù)返回一個(gè)可選的Int值, 如果找到了給定字符串, 他會(huì)返回?cái)?shù)組中第一個(gè)匹配的字符串的索引值, 如果找不到給定字符串就返回nil.
func findIndex(ofString valueToFind: String, in array: [String]) -> Int? {
for (index, value) in array.enumerated() {
if value == valueToFind {
return index
}
}
return nil
}
泛型版本:
func findIndex<T: Equatable>(ofString valueToFind: T, in array: [T]) -> Int? {
for (index, value) in array.enumerated() {
if value == valueToFind {
return index
}
}
return nil
}
-
Swift標(biāo)準(zhǔn)庫中定義了一個(gè)叫做Equatable的協(xié)議, 要求遵循其協(xié)議的類型要實(shí)現(xiàn)相等操作符(==)和不等操作符(!=), 用于比較該類型的任意兩個(gè)值. 所有Swift標(biāo)準(zhǔn)庫中的類型自動(dòng)支持Equatable協(xié)議. - 任何
Equatable的類型都能安全的用于findIndex(of:in:)函數(shù), 因?yàn)榭梢员WC那些類型支持相等操作符.
為了表達(dá)這個(gè)事實(shí), 當(dāng)定義函數(shù)式將Equatable類型約束作為類型形式參數(shù)定義的一部分, 也就是<T: Equatable>的原因