程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> 解析Swift中的泛型支撐與應用

解析Swift中的泛型支撐與應用

編輯:更多關於編程

解析Swift中的泛型支撐與應用。本站提示廣大學習愛好者:(解析Swift中的泛型支撐與應用)文章只能為提供參考,不一定能成為您想要的結果。以下是解析Swift中的泛型支撐與應用正文


1、以泛型為參數的函數

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

下面的辦法可以完成對隨意率性雷同類型變量的交流,函數參數中應用泛型,須要在函數名後的<>中界說參數占位符,若有多個參數占位符,用逗號離隔便可。

2、泛型在類型中的運用

泛型除可以作為函數的參數、前往值外,在界說類型時,靈巧運用泛型也能夠處理許多非常辣手的成績,例照實現一個棧構造的聚集類型,示例代碼以下:

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
}

3、泛型與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)

  1. 上一頁:
  2. No
Copyright © 程式師世界 All Rights Reserved