亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

Swift編程中的泛型解析

2020-01-26 14:50:02
字體:
來源:轉載
供稿:網友

泛型代碼可以讓你寫出根據自我需求定義、適用于任何類型的,靈活且可重用的函數和類型。它可以讓你避免重復的代碼,用一種清晰和抽象的方式來表達代碼的意圖。
 
泛型是 Swift 強大特征中的其中一個,許多 Swift 標準庫是通過泛型代碼構建出來的。事實上,泛型的使用貫穿了整本語言手冊,只是你沒有發現而已。例如,Swift 的數組和字典類型都是泛型集。你可以創建一個Int數組,也可創建一個String數組,或者甚至于可以是任何其他 Swift 的類型數據數組。同樣的,你也可以創建存儲任何指定類型的字典(dictionary),而且這些類型可以是沒有限制的。
 
泛型所解決的問題
這里是一個標準的,非泛型函數swapTwoInts,用來交換兩個Int值:

復制代碼 代碼如下:

func swapTwoInts(inout a: Int, inout b: Int)
    let temporaryA = a
    a = b
    b = temporaryA
}

這個函數使用寫入讀出(in-out)參數來交換a和b的值,請參考寫入讀出參數。
 
swapTwoInts函數可以交換b的原始值到a,也可以交換a的原始值到b,你可以調用這個函數交換兩個Int變量值:
復制代碼 代碼如下:

var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
println("someInt is now /(someInt), and anotherInt is now /(anotherInt)")
// 輸出 "someInt is now 107, and anotherInt is now 3"
swapTwoInts函數是非常有用的,但是它只能交換Int值,如果你想要交換兩個String或者Double,就不得不寫更多的函數,如 swapTwoStrings和swapTwoDoublesfunctions,如同如下所示:
func swapTwoStrings(inout a: String, inout b: String) {
    let temporaryA = a
    a = b
    b = temporaryA
}
 
func swapTwoDoubles(inout a: Double, inout b: Double) {
    let temporaryA = a
    a = b
    b = temporaryA
}

你可能注意到 swapTwoInts、 swapTwoStrings和swapTwoDoubles函數功能都是相同的,唯一不同之處就在于傳入的變量類型不同,分別是Int、String和Double。
 
但實際應用中通常需要一個用處更強大并且盡可能的考慮到更多的靈活性單個函數,可以用來交換兩個任何類型值,很幸運的是,泛型代碼幫你解決了這種問題。(一個這種泛型函數后面已經定義好了。)
 
注意: 在所有三個函數中,a和b的類型是一樣的。如果a和b不是相同的類型,那它們倆就不能互換值。Swift 是類型安全的語言,所以它不允許一個String類型的變量和一個Double類型的變量互相交換值。如果一定要做,Swift 將報編譯錯誤。

泛型函數:類型參數
泛型函數可以訪問任何數據類型,如:'Int' 或 'String'.

復制代碼 代碼如下:

func exchange<T>(inout a: T, inout b: T) {
   let temp = a
   a = b
   b = temp
}

var numb1 = 100
var numb2 = 200

println("Before Swapping Int values are: /(numb1) and /(numb2)")
exchange(&numb1, &numb2)
println("After Swapping Int values are: /(numb1) and /(numb2)")

var str1 = "Generics"
var str2 = "Functions"

println("Before Swapping String values are: /(str1) and /(str2)")
exchange(&str1, &str2)
println("After Swapping String values are: /(str1) and /(str2)")


當我們使用 playground 運行上面的程序,得到以下結果

Before Swapping Int values are: 100 and 200After Swapping Int values are: 200 and 100Before Swapping String values are: Generics and FunctionsAfter Swapping String values are: Functions and Generics

函數 exchange()用于交換其在上述方案中描述和<T>被用作類型參數值。這是第一次,函數 exchange()被調用返回Int值,第二次調用函數 exchange()將返回String值。多參數類型可包括用逗號分隔在尖括號內。

類型參數被命名為用戶定義來了解擁有類型參數的目的。 Swift 提供<T>作為泛型類型參數的名字。 但是型像數組和字典參數也可以命名為鍵,值,以確定它們輸入屬于“字典”。

泛型類型

復制代碼 代碼如下:

struct TOS<T> {
   var items = [T]()
   mutating func push(item: T) {
      items.append(item)
   }
  
   mutating func pop() -> T {
      return items.removeLast()
   }
}

var tos = TOS<String>()
tos.push("Swift")
println(tos.items)

tos.push("Generics")
println(tos.items)

tos.push("Type Parameters")
println(tos.items)

tos.push("Naming Type Parameters")
println(tos.items)


let deletetos = tos.pop()


當我們使用 playground 運行上面的程序,得到以下結果

[Swift][Swift, Generics][Swift, Generics, Type Parameters][Swift, Generics, Type Parameters, Naming Type Parameters]

擴展泛型類型
擴展堆棧屬性要知道該項目的頂部包含在“extension” 關鍵字。

復制代碼 代碼如下:

struct TOS<T> {
   var items = [T]()
   mutating func push(item: T) {
      items.append(item)
   }

   mutating func pop() -> T {
      return items.removeLast()
   }
}

var tos = TOS<String>()
tos.push("Swift")
println(tos.items)

tos.push("Generics")
println(tos.items)

tos.push("Type Parameters")
println(tos.items)

tos.push("Naming Type Parameters")
println(tos.items)

extension TOS {
   var first: T? {
      return items.isEmpty ? nil : items[items.count - 1]
   }
}

if let first = tos.first {
   println("The top item on the stack is /(first).")
}


當我們使用 playground 運行上面的程序,得到以下結果

[Swift][Swift, Generics][Swift, Generics, Type Parameters][Swift, Generics, Type Parameters, Naming Type Parameters]

在堆棧頂部的項目命名類型參數。

類型約束
Swift 語言允許“類型約束”指定類型參數是否從一個特定的類繼承,或者確保協議一致性標準。

復制代碼 代碼如下:

func exchange<T>(inout a: T, inout b: T) {
   let temp = a
   a = b
   b = temp
}

var numb1 = 100
var numb2 = 200

println("Before Swapping Int values are: /(numb1) and /(numb2)")
exchange(&numb1, &numb2)
println("After Swapping Int values are: /(numb1) and /(numb2)")

  
var str1 = "Generics"
var str2 = "Functions"

println("Before Swapping String values are: /(str1) and /(str2)")
exchange(&str1, &str2)
println("After Swapping String values are: /(str1) and /(str2)")


當我們使用 playground 運行上面的程序,得到以下結果

Before Swapping Int values are: 100 and 200After Swapping Int values are: 200 and 100Before Swapping String values are: Generics and FunctionsAfter Swapping String values are: Functions and Generics

關聯類型
Swift 允許相關類型,并可由關鍵字“typealias”協議定義內部聲明。

復制代碼 代碼如下:

protocol Container {
   typealias ItemType
   mutating func append(item: ItemType)
   var count: Int { get }
   subscript(i: Int) -> ItemType { get }
}

struct TOS<T>: Container {
   // original Stack<T> implementation
   var items = [T]()
   mutating func push(item: T) {
      items.append(item)
   }
  
   mutating func pop() -> T {
      return items.removeLast()
   }

   // conformance to the Container protocol
   mutating func append(item: T) {
      self.push(item)
   }
  
   var count: Int {
      return items.count
   }

   subscript(i: Int) -> T {
      return items[i]
   }
}

var tos = TOS<String>()
tos.push("Swift")
println(tos.items)

tos.push("Generics")
println(tos.items)

tos.push("Type Parameters")
println(tos.items)

tos.push("Naming Type Parameters")
println(tos.items)


當我們使用 playground 運行上面的程序,得到以下結果

[Swift][Swift, Generics][Swift, Generics, Type Parameters][Swift, Generics, Type Parameters, Naming Type Parameters]

Where 子句
類型約束使用戶能夠定義與泛型函數或類型相關聯的類型的參數要求。用于定義相關類型的 'where' 子句聲明為類型參數列表的一部分要求。 “where”關鍵字類型參數后面類型和相關類型之間的相關類型的限制,平等關系的列表后放置。

復制代碼 代碼如下:

 protocol Container {
   typealias ItemType
   mutating func append(item: ItemType)
   var count: Int { get }
   subscript(i: Int) -> ItemType { get }
}

struct Stack<T>: Container {
   // original Stack<T> implementation
   var items = [T]()
   mutating func push(item: T) {
      items.append(item)
   }

   mutating func pop() -> T {
      return items.removeLast()
   }

   // conformance to the Container protocol
   mutating func append(item: T) {
      self.push(item)
   }
  
   var count: Int {
      return items.count
   }

   subscript(i: Int) -> T {
      return items[i]
   }
}

func allItemsMatch<
   C1: Container, C2: Container
   where C1.ItemType == C2.ItemType, C1.ItemType: Equatable>
   (someContainer: C1, anotherContainer: C2) -> Bool {
   // check that both containers contain the same number of items
   if someContainer.count != anotherContainer.count {
      return false
}

// check each pair of items to see if they are equivalent
for i in 0..<someContainer.count {
   if someContainer[i] != anotherContainer[i] {
      return false
   }
}
      // all items match, so return true
      return true
}

var tos = Stack<String>()
tos.push("Swift")
println(tos.items)

tos.push("Generics")
println(tos.items)

tos.push("Where Clause")
println(tos.items)

var eos = ["Swift", "Generics", "Where Clause"]
println(eos)


當我們使用 playground 運行上面的程序,得到以下結果

[Swift][Swift, Generics][Swift, Generics, Where Clause][Swift, Generics, Where Clause]

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
最近2019中文字幕一页二页| 国产美女扒开尿口久久久| 久久精品这里热有精品| 国产精品 欧美在线| 欧美一区二粉嫩精品国产一线天| 国产精品欧美一区二区三区奶水| 国产成人啪精品视频免费网| 一区二区三区精品99久久| 国产精品白丝jk喷水视频一区| 亚洲热线99精品视频| 日韩动漫免费观看电视剧高清| 久久久久亚洲精品| 欧美在线免费看| 欧美激情视频一区二区三区不卡| 国产精品亚洲片夜色在线| 国产91在线播放精品91| 久久中国妇女中文字幕| 色老头一区二区三区| 亚洲第一区第一页| 亚洲黄色www| 亚洲tv在线观看| 欧美成人午夜激情在线| 欧美成人免费大片| 久久久影视精品| 国产日韩在线亚洲字幕中文| 中文字幕免费精品一区| 国产在线精品一区免费香蕉| 精品免费在线视频| 91久久久久久久久| 色老头一区二区三区| 国产精品视频yy9099| 不卡av日日日| 亚洲欧美在线播放| 日韩av第一页| 久久中文字幕一区| 美女扒开尿口让男人操亚洲视频网站| 国产日韩欧美视频在线| 成人福利视频在线观看| 欧美黄色小视频| 欧美激情一区二区三区成人| 成人精品一区二区三区电影黑人| 丝袜情趣国产精品| 北条麻妃在线一区二区| 亚洲少妇激情视频| 视频直播国产精品| 青青草一区二区| 欧美xxxx做受欧美.88| 欧美色视频日本高清在线观看| 欧美国产乱视频| 日韩欧美福利视频| 午夜精品福利视频| 性色av香蕉一区二区| 亚洲性线免费观看视频成熟| 欧美国产中文字幕| 草民午夜欧美限制a级福利片| 久久久av亚洲男天堂| 亚洲成色777777在线观看影院| 日韩精品极品在线观看播放免费视频| 懂色aⅴ精品一区二区三区蜜月| 成人国产亚洲精品a区天堂华泰| 欧美日韩美女在线| 中日韩午夜理伦电影免费| 国产精品美女www| 美女精品久久久| 国产不卡av在线| 奇米4444一区二区三区| 亚洲人成网站777色婷婷| 久久影视电视剧免费网站清宫辞电视| 日本欧美国产在线| 国产97免费视| 日韩欧美国产成人| 91高清在线免费观看| 97视频免费在线看| 国产精品久久中文| 97视频在线观看网址| 国产视频福利一区| 亚洲一区二区三区成人在线视频精品| 日韩电影在线观看永久视频免费网站| 色综合老司机第九色激情| 色综合老司机第九色激情| 亚洲国产精品久久久久秋霞蜜臀| 久久福利视频导航| 欧美激情精品久久久久| 国产精品69精品一区二区三区| 国产精品av在线播放| 在线亚洲男人天堂| 色婷婷综合久久久久| 91久久国产精品| 久久精品国产清自在天天线| 伊人久久久久久久久久久| 亚洲美女精品成人在线视频| 一区二区中文字幕| 亚洲大胆人体av| 亚洲欧美另类中文字幕| 久久精品小视频| 国产精品精品一区二区三区午夜版| 欧美一区三区三区高中清蜜桃| 国语自产在线不卡| 91免费在线视频网站| 青草青草久热精品视频在线网站| 日本电影亚洲天堂| 久久中文精品视频| 亚洲第一男人天堂| 欧美一区三区三区高中清蜜桃| 亚洲国产精品va在线观看黑人| 久久久久中文字幕| 日韩欧美在线免费| 疯狂欧美牲乱大交777| 亚洲香蕉成视频在线观看| 欧美精品在线网站| 日韩欧美亚洲一二三区| 日韩中文在线中文网在线观看| 精品一区二区三区三区| 日韩欧美国产中文字幕| 亚洲第一天堂av| 亚洲新声在线观看| 亚洲精品小视频| 久久久久久九九九| 亚洲精品综合精品自拍| 在线精品视频视频中文字幕| 亚洲高清不卡av| 色妞欧美日韩在线| 欧美在线激情视频| 国产精品电影网| 久久久国产一区| 55夜色66夜色国产精品视频| 38少妇精品导航| 成人精品一区二区三区电影黑人| 国产精品久久一| 国产精品日日摸夜夜添夜夜av| 欧美精品福利在线| 亚洲欧美制服第一页| 在线观看亚洲视频| 成人妇女淫片aaaa视频| 国产精品h片在线播放| 精品欧美激情精品一区| 精品久久久av| 国产精品一区二区三区久久| 亚洲第一区中文字幕| 在线观看中文字幕亚洲| 久久久久久久久久av| 国产精品爱久久久久久久| 中文字幕日韩视频| 日韩精品免费综合视频在线播放| 日韩电视剧免费观看网站| 69国产精品成人在线播放| 午夜精品蜜臀一区二区三区免费| 狠狠久久亚洲欧美专区| 亚洲天堂av综合网| 国产综合在线看| 高清一区二区三区四区五区| 欧美孕妇毛茸茸xxxx| 欧美第一淫aaasss性| 91精品久久久久久久久久久| 日本aⅴ大伊香蕉精品视频| 亚洲一区亚洲二区亚洲三区| 日韩欧美在线一区| 国产精品福利观看| 国产精品久久综合av爱欲tv| 国产精品自在线| 国产日韩欧美影视| 欧美电影免费在线观看| 欧美综合激情网| 亚洲石原莉奈一区二区在线观看|