泛型是Swift語言強大的核心,泛型是對類型的抽象,使用泛型開發者能夠更加靈活方便的表達代碼意圖。咱們知道,有參函數的參數必須有一個明確的參數類型,有些時候開發者會遇到這樣一種狀況,編寫一個函數用於交換兩個變量的值,因爲變量有類型之分,實現相同的功能,可能須要重載成多個函數來實現,這大大浪費了開發成本,使用泛型,能夠完美的解決這個問題,示例代碼以下:javascript
func exchange<T>(inout param1:T,inout param2:T){ let tmp = param1 param1 = param2 param2 = tmp } var p1 = "15" var p2 = "40" exchange(&p1, param2: &p2)
上面的方法能夠實現對任意相同類型變量的交換,函數參數中使用泛型,須要在函數名後的<>中定義參數佔位符,若有多個參數佔位符,用逗號隔開便可。java
泛型除了能夠做爲函數的參數、返回值外,在定義類型時,靈活應用泛型也能夠解決不少十分棘手的問題,例如實現一個棧結構的集合類型,示例代碼以下:編程
struct Stack<ItemType> { var items:[ItemType] = [] mutating func push(param:ItemType) { self.items.append(param) } mutating func pop()->ItemType{ return self.items.removeLast() } } //整型棧 var obj1 = Stack<Int>() obj1.push(1) obj1.pop() //字符串棧 var obj2 = Stack<String>() obj2.push("HS") obj2.pop()
在對使用了泛型的類型進行擴展時,不須要在使用<>進行泛型的定義,直接使用原定義的泛型佔位符便可,示例以下:app
extension Stack{ func getArray() -> [ItemType] { return items } }
有時候,開發者須要對泛型進行一些約束,例如只容許此泛型是繼承自某個類或者實現了某個協議,示例代碼以下:函數
class MyClass { } //只有MyClass的子類能夠進行Stack棧的建立 struct Stack<ItemType:MyClass> { var items:[ItemType] = [] mutating func push(param:ItemType) { self.items.append(param) } mutating func pop()->ItemType{ return self.items.removeLast() } }
在協議中,可使用另外一種方式來進行泛型編程,使用associatedtype關鍵字能夠進行類型關聯,示例以下:spa
protocol MyProtocol { //實現協議時才指定類型 associatedtype ItemType var param:ItemType {get set} } class MyClass:MyProtocol { //因爲Swift能夠自動識別類型 這是MyProtocol中的ItemType爲Int var param: Int = 0 }
使用where子句能夠對泛型進行更加嚴格約束,使其符合開發者須要的邏輯,示例以下:code
//T和C都要遵照整型協議 class MyClassTwo<T,C where T:IntegerType,C:IntegerType> { var param1:T var param2:C init(param1:T,param2:C){ self.param1=param1 self.param2=param2 } } var obj3 = MyClassTwo(param1: 1, param2: 1)
專一技術,熱愛生活,交流技術,也作朋友。繼承
——琿少 QQ羣:203317592ip