Swift學(xué)習(xí)筆記-泛型

泛型能讓我們使用的類型和函數(shù)使用未知的類型,許多內(nèi)置類型,例如可空類型,數(shù)組和字典都是用泛型實現(xiàn)的。

泛型類型

下面的結(jié)構(gòu)體實現(xiàn)了一個簡單的棧,可以對Int類型執(zhí)行push和pop操作。

struct Stack{
    var items = [Int]()
    
    mutating func push(newitem:Int){
        items.append(newitem)
    }
    
    mutating func pop() ->Int?{
        guard !items.isEmpty else{
            return nil
        }
        return items.removeLast()
    }
    
}

var stack=Stack()
stack.push(newitem:1)
stack.push(newitem:2)
print(stack.pop())
print(stack.pop())

但是如果我們需要對其他類型進行入棧和出棧操作,那就得再編寫一個棧類型,使用泛型可以讓這個棧支持任意類型。改寫后的代碼如下,Swift的泛型語法和Java差不多。

struct Stack<T>{
    var items = [T]()
    
    mutating func push(newitem:T){
        items.append(newitem)
    }
    
    mutating func pop() ->T?{
        guard !items.isEmpty else{
            return nil
        }
        return items.removeLast()
    }
    
}

var stack=Stack<Int>()
stack.push(newitem:1)
stack.push(newitem:2)
print(stack.pop())
print(stack.pop())

多個占位類型

泛型可支持多個占位類型,代碼如下。

struct Stack<T,U,X>{
    var items = [T]()
    var items1 = [U]()
    var items2 = [X]()
    ...
}
var stack=Stack<Int,String,Double>()

泛型函數(shù)和方法

泛型函數(shù)需要在函數(shù)參數(shù)列表前聲明占位類型,然后可以在參數(shù)和返回值中使用這些占位類型。

func getSelf<T>(arg:T)->T{
    return arg
}

print(getSelf(arg: "hello world!"))

類型約束

有時候我們需要對傳入的類型做一些限制,可以通過類型約束實現(xiàn),有兩種約束:一種是類型必須是給定類的子類,還有一種是類型必須符合一個協(xié)議。

func checkEqual<T:Equatable>(first:T,second:T)->Bool{
    return first==second
}
print(checkEqual(first: 1, second: 1))
print(checkEqual(first: "123", second: "456"))

當(dāng)占位類型比較復(fù)雜時,我們還可以使用where語句進一步約束占位類型,如下代碼要求newitems的元素必須是T類型。

struct Stack<T>{
    var items = [T]()
    
    mutating func push(newitem:T){
        items.append(newitem)
    }
    
    mutating func pushAll<S:Sequence>(newitems:S)
        where S.Iterator.Element==T {
            for item in newitems {
                self.push(newitem: item)
                print("push \(item)")
            }
    }
    
    mutating func pop() ->T?{
        guard !items.isEmpty else{
            return nil
        }
        return items.removeLast()
    }
}


var stack=Stack<Int>()
stack.pushAll(newitems:[1,2,3,4,5,6])

關(guān)聯(lián)類型協(xié)議

協(xié)議不支持泛型,但是支持另外一種特性:關(guān)聯(lián)類型,在協(xié)議內(nèi)部可以使用associatedtype關(guān)鍵字聲明一個占位類型,符合這個協(xié)議的類型應(yīng)該在其內(nèi)部為占位類型提供typealias定義。

protocol InteratorProtocol {
    associatedtype Element
    mutating func next() -> Element?
}


struct Stack<T>:InteratorProtocol {
    typealias Element = Int
    
    mutating func next() -> Element? {
        return 0
    }
}
最后編輯于
?著作權(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)容

  • 本章將會介紹 泛型所解決的問題泛型函數(shù)類型參數(shù)命名類型參數(shù)泛型類型擴展一個泛型類型類型約束關(guān)聯(lián)類型泛型 Where...
    寒橋閱讀 713評論 0 2
  • 泛型(Generics) 泛型代碼允許你定義適用于任何類型的,符合你設(shè)置的要求的,靈活且可重用的 函數(shù)和類型。泛型...
    果啤閱讀 759評論 0 0
  • 136.泛型 泛型代碼讓你可以寫出靈活,可重用的函數(shù)和類型,它們可以使用任何類型,受你定義的需求的約束。你可以寫出...
    無灃閱讀 1,658評論 0 4
  • 《正面管教》讀書筆記2 自尊:一個容易造成錯覺的概念 贊揚,快樂小貼紙,笑臉以及讓孩子做今天最重要的人,會讓孩子認...
    z咩咩羊閱讀 354評論 1 1
  • 小說從莉迪亞的死因探索寫起,在循序漸進中,我們遇見了有夢而不得的瑪麗琳,自卑怯懦的詹姆斯,孤獨內(nèi)向的內(nèi)斯,弱小可憐...
    懷亞有烏斯閱讀 290評論 0 0

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