解析Swift中的泛型支持與運用。本站提示廣大學習愛好者:(解析Swift中的泛型支持與運用)文章只能為提供參考,不一定能成為您想要的結果。以下是解析Swift中的泛型支持與運用正文
一、以泛型為參數的函數
泛型是Swift言語弱小的中心,泛型是對類型的籠統,運用泛型開發者可以愈加靈敏方便的表達代碼意圖。我們知道,有參函數的參數必需有一個明白的參數類型,有些時分開發者會遇到這樣一種狀況,編寫一個函數用於交流兩個變量的值,由於變量有類型之分,完成相反的功用,能夠需求重載成多個函數來完成,這大大糜費了開發本錢,運用泛型,可以完滿的處理這個問題,示例代碼如下:
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)
下面的辦法可以完成對恣意相反類型變量的交流,函數參數中運用泛型,需求在函數名後的<>中定義參數占位符,如有多個參數占位符,用逗號隔開即可。
二、泛型在類型中的使用
泛型除了可以作為函數的參數、前往值外,在定義類型時,靈敏使用泛型也可以處理很多非常順手的問題,例照實現一個棧構造的集合類型,示例代碼如下:
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()
在對運用了泛型的類型停止擴展時,不需求在運用<>停止泛型的定義,直接運用原定義的泛型占位符即可,示例如下:
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關鍵字可以停止類型關聯,示例如下:
protocol MyProtocol { //完成協議時才指定類型 associatedtype ItemType var param:ItemType {get set} } class MyClass:MyProtocol { //由於Swift可以自動辨認類型 這是MyProtocol中的ItemType為Int var param: Int = 0 }
三、泛型與where子句的結合運用
運用where子句可以對泛型停止愈加嚴厲約束,使其契合開發者需求的邏輯,示例如下:
//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)