Swift中的泛型

1. 泛型函數(shù)

func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
    let t = a
    a = b
    b = t
}

var someInt = 3
var anotherInt = 7
swapTwoValues(&someInt, &anotherInt)
print("\(someInt), \(anotherInt)")
// print "7, 3"

var someString = "hello"
var anotherString = "world"
swapTwoValues(&someString, &anotherString)

T 是占位類型名,用來代替實際類型名。

2. 泛型類型

下面的例子定義了一個泛型的棧(stack)結(jié)構(gòu)體,從而能夠處理任意類型的值。

struct Stack<Element> {
    var items = [Element]()
    mutating func push(item: Element) {
        items.append(item)
    }
    mutating func pop() -> Element {
        return items.removeLast()
    }
}

var stackOfStrings = Stack<String>()
stackOfStrings.push(item: "A")
stackOfStrings.push(item: "B")
stackOfStrings.push(item: "C")

let fromTheTop = stackOfStrings.pop()

3. 擴展一個泛型類型

extension Stack {
    var topItem: Element? {
        return items.isEmpty ? nil : items[items.count - 1]
    }
}

stackOfStrings.topItem // "B"

4. 類型約束

func findIndex(ofString valueToFind: String, in array: [String]) -> Int? {
    for(index, value) in array.enumerated() {
        if value == valueToFind {
            return index
        }
    }
    return nil
}
let strings = ["A", "B", "C"]
if let foundIndex = findIndex(ofString: "B", in: strings) {
    print("\(foundIndex)")
}
// print "1"

上面的例子展示了在一個字符串?dāng)?shù)組中找到對應(yīng)字符串的索引,但是并不適用于包含其他類型的元素的數(shù)組。

func findIdex<T: Equatable>(array: [T], _ valueToFind: T) -> Int? {
    for (index, value) in array.enumerated() {
        if value == valueToFind {
            return index
        }
    }
    return nil
}

Equatable 給占位類型 T 添加了類型約束,意味著上面的函數(shù)只能包含 Equatable 類型的元素。不是所有的 Swift 類型都可以用 == 進行比較,除非該類型遵循了 Equatable 協(xié)議。

5. 關(guān)聯(lián)類型

關(guān)聯(lián)類型為協(xié)議中的某個類型提供了一個占位名,其代表的實際類型在協(xié)議被采納時才會被指定,用關(guān)鍵字 associatedtype 關(guān)鍵字來指定關(guān)聯(lián)類型。

protocol Container {
    associatedtype ItemType
    mutating func append(item: ItemType)
    var count: Int { get }
    subscript(i: Int) -> ItemType  { get }
}

我們還可以通過擴展一個存在的類型來指定關(guān)聯(lián)類型,比如:

extension Array: Container {} 

6. 泛型Where語句

where 字據(jù)可以給一個關(guān)聯(lián)類型添加類型約束,語法如下:

func genericFunc<S>(p: S) -> returnType where #判斷語句# {
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift泛型介紹 泛型是為Swift編程靈活性的一種語法,在函數(shù)、枚舉、結(jié)構(gòu)體、類中都得到充分的應(yīng)用,它的引入可...
    Bobby0322閱讀 14,268評論 0 26
  • 本章將會介紹 泛型所解決的問題泛型函數(shù)類型參數(shù)命名類型參數(shù)泛型類型擴展一個泛型類型類型約束關(guān)聯(lián)類型泛型 Where...
    寒橋閱讀 714評論 0 2
  • 泛型的概念 泛型代碼可根據(jù)自定義需求,寫出適用于任何類型、靈活且可重用的函數(shù)和類型,避免重復(fù)的代碼,用一種清晰和抽...
    伯wen閱讀 462評論 0 2
  • 泛型(Generics) 泛型代碼允許你定義適用于任何類型的,符合你設(shè)置的要求的,靈活且可重用的 函數(shù)和類型。泛型...
    果啤閱讀 760評論 0 0
  • 作為一個一直說的比做的多的家伙,都有點羞愧講這么一件事情,但是就像我朋友說的自從我做了預(yù)售,臉皮是日漸豐盈了。 那...
    夢游世界閱讀 277評論 0 0

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