設(shè)計模式之泛型模式

  • 注意?。。?! 如果你是技術(shù)大牛、技術(shù)大咖,請略過這篇文章避免耽擱您的時間,這篇文章屬于入門級別。??
什么是泛型?

定義的時候不需要指定類型,在客戶端使用的時候再去指定類型。舉個簡單泛型??,交換兩個數(shù)值??梢越粨Q兩個Int類型的數(shù)值,也可以交換兩個Double類型的數(shù)值,float 。。??赡苊總€類型都寫一個交換方法,但是參數(shù)結(jié)構(gòu)和邏輯結(jié)構(gòu)類似,因此解決方法就是泛型設(shè)計

  • 方法泛型設(shè)計(以swift舉例)
//方法泛型
    func swipTwoNum<T>(a:inout T, b:inout T) {
        let c = a
        a = b
        b = c
    }
      //測試
        let generics = GenericsTest1()
        var num1:Int = 20, num2:Int = 100
        generics.swipTwoNum(a: &num1, b: &num2)

        var num3:Double = 55.5, num4:Double = 110.5
        generics.swipTwoNum(a: &num3, b: &num4)

        print("交換之后的 num1 = \(num1)  num2 = \(num2) num3 = \(num3)  num4 = \(num4)")

  • 類泛型設(shè)計:類似于方法泛型,目的是讓這個類任何的類型都可以使用,而非局限于Int Double float... swift的Array設(shè)計就是泛型,這里舉例自己寫個ArrayList
class ArrayList<T> {

    private var array = Array<T>()

    func add(obj:T) {
        self.array.append(obj)
    }

    func get(index:Int) -> T {
        return self.array[index]
    }

    func remove(index:Int) {
        self.array.remove(at: index)
    }

    func forEach() {
        for item in array {
            print(item)
        }
    }
}
//類泛型設(shè)計測試,使用的時候再指定類型
        let array = ArrayList<Int>()
        array.add(obj: 100)
        array.add(obj: 200)
        array.add(obj: 300)
        let arrayDouble = ArrayList<Double>()
        arrayDouble.add(obj: 100.5)
        arrayDouble.add(obj: 200.5)
        arrayDouble.add(obj: 300.5)

  • 泛型的繼承(設(shè)計遵循開閉原則:修改封閉,擴展開放) 對于swift語言有兩種實現(xiàn)方式 第一種swift的特性:extension 第二種:繼承。這里使用繼承的方式
父類代碼
class AbsArrayList<T> {

    public var array = Array<T>()

    func add(obj:T) {
        self.array.append(obj)
    }
    func get(index:Int) -> T {
        return self.array[index]
    }

    func remove(index:Int) {
        self.array.remove(at: index)
    }

    func forEach() {
        for item in array {
            print(item)
        }
    }
}
子類
//泛型的繼承
class YSLArrayList<T>: AbsArrayList<T> {
    func removeAll() {
        self.array.removeAll()
    }
}
 //泛型繼承測試
        let array = YSLArrayList<Int>()
        array.add(obj: 100)
        array.add(obj: 200)
        array.add(obj: 300)
        array.forEach()
        array.removeAll()

  • 泛型設(shè)計---泛型協(xié)議 (讓所有ArrayList 實現(xiàn)ArrayPorotol)
協(xié)議
//泛型協(xié)議
protocol SLIArray {
    //定義關(guān)聯(lián) 相當于class 類名之后<TypeArray>的寫法 在協(xié)議中不允許這種<TypeArray>寫法
    associatedtype TypeArray

    func add(obj:TypeArray)
    func remove(index:Int)
    func get(index:Int) -> TypeArray?
    func removeAll()
    func forEach()
}

具體實現(xiàn)
class InheritArrayList<T>: SLIArray {

    typealias TypeArray = T

    var array = Array<T>()

    func add(obj:T) {
        self.array.append(obj)
    }
    func remove(index:Int){
        self.array.remove(at: index)
    }
    func get(index:Int) -> T? {
        return self.array[index]
    }
    func removeAll(){
        print("刪除全部")
        self.array.removeAll()
    }
    func forEach(){
        for item in self.array {
            print(item)
        }
    }
}

泛型協(xié)議測試
        let array = InheritArrayList<Double>()
        array.add(obj: 11.0)
        array.add(obj: 21.0)
        array.add(obj: 31.0)
        array.forEach()
        array.removeAll()

  • 泛型類型約束 -- 泛型的類型范圍,就是限制這個泛型必須是某個類型的子類(子類有很多,這里是指子類的一種)
    約束類型格式 : class 類名<泛型類型名: 約束類型名> {}

舉個?? 我有一個BaseModel,一個UserModel是BaseModel的子類,依舊用ArrayList為泛型示例,代碼如下:

//BaseModel
class BaseModel: NSObject {
    var token:String?
}
//UserModel
class UserModel: BaseModel {
    var password:String?
    var userName:String?
}
//ArrayList示例
class YSL_ModelArray<T: BaseModel>: SLIArray {

    typealias TypeArray = T

    var array = Array<T>()

    func add(obj:T) {
        self.array.append(obj)
    }
    func remove(index:Int){
        self.array.remove(at: index)
    }
    func get(index:Int) -> T? {
        return self.array[index]
    }
    func removeAll(){
        print("刪除全部")
        self.array.removeAll()
    }
    func forEach(){
        for item in self.array {
            print(item)
        }
    }
}

//在ViewController中測試一下
//限制泛型協(xié)議
        let userModel = UserModel()
        userModel.password = "123456"
        userModel.userName = "Administritor"
        let modelArray = YSL_ModelArray<BaseModel>()
        modelArray.add(obj: userModel)
        modelArray.forEach()

//給泛型加了限制之后,就不能再用任意的其他類型了,如果給個Int、Double 就會報錯,必須傳BaseModel這一類,圖:

WechatIMG.jpeg
如果有不同的見解 --> 留言區(qū) ---> 請多多指教。?? ?? ??
最后編輯于
?著作權(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)容

  • 2014年的蘋果全球開發(fā)者大會(WWDC),當Craig Federighi向全世界宣布“We have new ...
    yeshenlong520閱讀 2,394評論 0 9
  • 136.泛型 泛型代碼讓你可以寫出靈活,可重用的函數(shù)和類型,它們可以使用任何類型,受你定義的需求的約束。你可以寫出...
    無灃閱讀 1,652評論 0 4
  • 泛型代碼可以確保你寫出靈活的,可重用的函數(shù)和定義出任何你所確定好的需求的類型。你的可以寫出避免重復的代碼,并且用一...
    iOS_Developer閱讀 875評論 0 0
  • 泛型(Generics) 泛型代碼允許你定義適用于任何類型的,符合你設(shè)置的要求的,靈活且可重用的 函數(shù)和類型。泛型...
    果啤閱讀 758評論 0 0
  • 本章將會介紹 泛型所解決的問題泛型函數(shù)類型參數(shù)命名類型參數(shù)泛型類型擴展一個泛型類型類型約束關(guān)聯(lián)類型泛型 Where...
    寒橋閱讀 712評論 0 2

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