Swift 泛型(Generics)

學(xué)習(xí)記錄,有搬運

Swift泛型能夠讓你根據(jù)自己的需求,寫出通用于\color{red}{任何類型}的,靈活的,可復(fù)用的函數(shù)。泛型是Swfit最強大的特性之一,廣泛用于個基礎(chǔ)庫.
泛型可將類型參數(shù)化,提高代碼復(fù)用率,減少代碼量

泛型函數(shù)

函數(shù)使用了一個“占位符類型”,其規(guī)定參數(shù)\color{red}{a}\color{red}只能是同一個類型\color{purple}{T}?;蛘哒f都是\color{purple}{T}所表示的類型
泛型函數(shù)可用于任何類型
如下:
inout修飾語傳送門

func swapValue<T>(a: inout T,b: inout T) {
        let temp = a
        a = b
        b  = temp
}        
var aa = 10
var bb = 20
swapValue(a: &aa, b: &bb)
//或者
var aa = "10"
var bb = "20"
swapValue(a: &aa, b: &bb)

其中\color{purple}{T}會自動推斷類型為\color{purple}{Int}或者\color{purple}{String},\color{purple}{T}還可以是任意其他類型,如[\color{purple}{String}],這樣就不用判斷類型,直接調(diào)用\color{purple}{swapValue()}函數(shù)即可

泛型類型

Swift允許你定義自己的泛型類型。它們是可以用于任意類型的自定義類、結(jié)構(gòu)體、枚舉,和\color{purple}{Array}、\color{purple}{Dictionary}方式類似。
比如,自定義一個類型\color{purple}{Stack},實現(xiàn)方便地存儲數(shù)據(jù)到數(shù)組。
如下:

struct Stack<Element> {
    //Element為占位類型,可隨意命名
    var items = [Element]()
    mutating func push(item:Element) {
        items.insert(item, at: 0)
    }
    mutating func pop(){
        items.removeFirst()
    }
}
//創(chuàng)建時,指定占位類型為String類型
var stack = Stack<String>()
stack.push(item: "a")
stack.push(item: "b")
stack.push(item: "c")
Swift.print(stack)
Swift.print("pop")
stack.pop()
Swift.print(stack)

關(guān)聯(lián)類型(AssociatedType)

定義一個協(xié)議時,有時候在協(xié)議中聲明一個或多個關(guān)聯(lián)類型是很有用的。關(guān)聯(lián)類型即,把一個"占位類型"\color{purple}{T}給協(xié)議中用到的類型。直到采納協(xié)議時才指定T的實際類型。關(guān)聯(lián)類型通過associatedType關(guān)鍵字指定。

protocol Stackable {
    associatedtype Element // 關(guān)聯(lián)類型,這時還未確定具體是什么類型
    var items:[Element]  { get set }
    mutating func push(item:Element)
    mutating func pop()
    func top() -> Element?
    func size() -> Int
}
extension Stackable{//通過分類實現(xiàn)默認(rèn)函數(shù)
    mutating func push(item:Element){
        items.insert(item, at: 0)
    }
    mutating func pop(){
        items.removeFirst()
    }
    func top() -> Element?{
        items.first
    }
    func size() -> Int{
        items.count
    }
}

class StringStack: Stackable,CustomStringConvertible {
    //給關(guān)聯(lián)類型設(shè)定為String
    typealias Element = String
    var items: [String] = [String]()
    //重寫控制臺打印內(nèi)容
    var description: String{
        var dict: [String: Any] = [:]
        // 遍歷所有屬性
        Mirror(reflecting: self).children.forEach { (child) in
            guard let key = child.label else { return }
            dict[key] = child.value
        }
        return "\(Self.self): \(dict)"
    }
}

協(xié)議中也可以申明多個關(guān)聯(lián)類型

類型約束

指出一個類型形式參數(shù),必須繼承自特定類,或遵循一個特定協(xié)議、組合協(xié)議。

protocol Runable {
    
}
class Person {
    func swapValues<T:Person & Runable>(a: inout T,b: inout T) {
        (a,b) = (b,a)
    }
}

可選項的本質(zhì)是\color{purple}{enum}類型

public enum CustomOptional<Wrapped> {
    case none
    case some(Wrapped)
}
 var age1:CustomOptional = .some(10)
 var age2 = CustomOptional<Int>.some(10)
 var age3:CustomOptional<Int> = .some(10)
 age3 = .none
?著作權(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 — 泛型(Generics) [TOC] 本文將介紹泛型的一些用法、關(guān)聯(lián)類型、where語句,以及對泛...
    just東東閱讀 1,453評論 0 3
  • 場景:類型參數(shù)化,增強代碼的復(fù)用性 很多 Swift 標(biāo)準(zhǔn)庫是基于泛型構(gòu)建Array 和Dictionary 類型...
    Sunday_David閱讀 1,306評論 0 0
  • 泛型代碼讓你能根據(jù)你所定義的要求,寫出可以用于任何類型的靈活的、可復(fù)用的函數(shù)。泛型是 Swift 最強大的特性之一...
    Arthur澪閱讀 974評論 0 0
  • 泛型(Generics) 泛型代碼允許你定義適用于任何類型的,符合你設(shè)置的要求的,靈活且可重用的 函數(shù)和類型。泛型...
    果啤閱讀 761評論 0 0
  • 1. 前言 泛型代碼讓你能根據(jù)你所定義的要求寫出可以用于任何類型的靈活的、可復(fù)用的函數(shù)。你可以編寫出可復(fù)用、意圖表...
    搬運工iOS橙閱讀 982評論 0 1

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