Swift 泛型(Generics)

學習記錄,有搬運

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

泛型函數

函數使用了一個“占位符類型”,其規(guī)定參數\color{red}{a}\color{red}只能是同一個類型\color{purple}{T}。或者說都是\color{purple}{T}所表示的類型
泛型函數可用于任何類型
如下:
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}],這樣就不用判斷類型,直接調用\color{purple}{swapValue()}函數即可

泛型類型

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

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)

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

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

protocol Stackable {
    associatedtype Element // 關聯(lián)類型,這時還未確定具體是什么類型
    var items:[Element]  { get set }
    mutating func push(item:Element)
    mutating func pop()
    func top() -> Element?
    func size() -> Int
}
extension Stackable{//通過分類實現默認函數
    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 {
    //給關聯(lián)類型設定為String
    typealias Element = String
    var items: [String] = [String]()
    //重寫控制臺打印內容
    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é)議中也可以申明多個關聯(lián)類型

類型約束

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

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

可選項的本質是\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
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Swift — 泛型(Generics) [TOC] 本文將介紹泛型的一些用法、關聯(lián)類型、where語句,以及對泛...
    just東東閱讀 1,440評論 0 3
  • 場景:類型參數化,增強代碼的復用性 很多 Swift 標準庫是基于泛型構建Array 和Dictionary 類型...
    Sunday_David閱讀 1,297評論 0 0
  • 泛型代碼讓你能根據你所定義的要求,寫出可以用于任何類型的靈活的、可復用的函數。泛型是 Swift 最強大的特性之一...
    Arthur澪閱讀 943評論 0 0
  • 泛型(Generics) 泛型代碼允許你定義適用于任何類型的,符合你設置的要求的,靈活且可重用的 函數和類型。泛型...
    果啤閱讀 758評論 0 0
  • 1. 前言 泛型代碼讓你能根據你所定義的要求寫出可以用于任何類型的靈活的、可復用的函數。你可以編寫出可復用、意圖表...
    搬運工iOS橙閱讀 964評論 0 1

友情鏈接更多精彩內容