Swift 5.x 泛型的類型約束

  • swapTwoValues(_:_:)函數(shù)和Stack類型可以用于任意類型. 但是, 有時(shí)在用于泛型函數(shù)的類型和泛型類型上, 強(qiáng)制其遵循特定的類型約束很有用. 類型約束指出一個(gè)類型形式參數(shù)必須繼承自特定類, 或者遵循一個(gè)特定的協(xié)議、組合協(xié)議.
  • 例如, SwiftDictionary類型在可以用于字典中鍵的類型上設(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>的原因
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容