- 注意?。。?! 如果你是技術(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