国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Swift > 正文

解析Swift中的泛型支持與使用

2020-03-09 17:47:49
字體:
來源:轉載
供稿:網友

一、以泛型為參數的函數

泛型是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)


注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 溧水县| 九龙县| 改则县| 通州市| 商都县| 遂昌县| 江达县| 铁岭市| 拉孜县| 长丰县| 武定县| 商丘市| 泌阳县| 谢通门县| 崇义县| 浦东新区| 四子王旗| 临清市| 金沙县| 边坝县| 浏阳市| 马山县| 丹江口市| 东乌珠穆沁旗| 铜陵市| 当涂县| 永州市| 曲沃县| 文成县| 建宁县| 瑞丽市| 民乐县| 鄂托克前旗| 莱阳市| 尼勒克县| 鹤壁市| 乐安县| 吉木乃县| 砀山县| 威远县| 新河县|