系統整理 精講 swift 泛型

來源:互聯網
上載者:User

標籤:

泛型是一種非常領會的文法,讓我很是膜拜!

真是讓人又愛又恨,學不懂的時候很抓狂

允許程式在函數,枚舉,結構體,類中定義類型形參(類型可以動態改變)

每次使用可以傳入不同類型的形參!

Array<T>   T就是泛型,代表數組元素的類型

struct Dictionary《Key:Hashable,Value》 key value是泛型文法

Array<String>限定了元素類型 位String的數組

為什麼要用?會帶來哪些方便?請看下面例子

要求:前一個數組追加到後一個數組中

func copyIntArray(src:[Int],inout dest:[Int])

{

// 遍曆 並加到數組後邊

for element in src{

dest.append(element)

}

}

使用

var arr = [2,5]

copyIntArray([12,9],&arr)

println(arr) // [2,5,12,9]

那麼再要求讓你實現添加字串呢,好吧重寫一個

func copyStringArray(src:[String],inout dest:[String])

{

for element in src{

dest.append(element)

}

}

使用

var  strArr = ["oc","swift"]

copyStringArray(["php",&strArr])

大家發現了吧,除了類型以外,其他代碼都一樣的,為什麼重複造輪子?合二為一吧。假如還有Double類型呢?

泛型派上用場了

泛型函數:指定一個或多個類型預留位置,類型暫時不確定,等具體調用的時候再確定

func copyArray<T>(src:[T],inout dest:[T])

{

for element in src

{
dest.append(element)
}

}

看到如此強大了吧?

然後隨意使用

var arr = [5,8]

copyArray([9,58],&arr)

var strArr = ["renhairui","hello"]

copyArray(["nihao",&strArr])

var doubleArr = [1.2,3.4]

copyArray([6.5,1.0],&doubleArr)

T是類型預留位置,可以當成普通類型使用

通過泛型,讓函數具有更好的適應性

下邊來深入一下:定義多個型別參數

要求:投影運算, 數群組類型不確定,怎麼投影不確定,傳回值類型不確定

先定義兩個型別參數

SrcType 代表需要執行投影數組的元素類型

DscType 得到的元素類型

func projection<SrcType,DescType>(src:[SrcType],fn:(SrcType)->DescType)->[DescType]

{

var result = [DescType]

for element in src

{

// 使用fn函數對數組元素進行投影運算,將運算結果添加到result數組中

result.append(fn(element))

}

}

使用

var books = ["任海瑞","iOS","engineer"]

使用尾隨閉包

var proj1 = projection(books){
countElements($0) //計算元素長度
}

println(proj1) // [3,3,8]

假如

var proj2 = projection(books){
"<"+$0+">"

}

println(proj2) //["<任海瑞>","<iOS>","<engineer>"]

再如

books = ["PHP","iOS","swift"]

var proj3 = projection(books){
(b:String)->(String,String) in

return (b,"任海瑞")

}

println(proj3) //["PHP,任海瑞","iOS,任海瑞","swift,任海瑞"]

另外也可以改變 books 的類型,任意類型。

定義泛型類型

struct Rect<T>

{
var x:T

var y:T

var width:T

var height:T

// 計算屬性

var position:(T,T)

{
return (self.x,self.y)
}
}

使用

let rect = Rect<Double>(x:1.2,y3.4,width:8.5,height:7.8)

let (x,y) = rect.position

println("\(x),\(y)")

let rect2 = Rect<Int>(x:3,y:6,width:10,height:30)

let(x,y) = rect.postion

 

class Apple<T>

{
var info:T

init(info:T)

{

self.info = info

}
}

使用

var a1= Apple<String>(info:"蘋果")

println(a1.info)

var a2 = Apple<Double>(info:5.6)

 

從泛型類派生出子類

class A:Apple<T>

{ }

未完善如下:

要求泛型類的子類也帶泛型聲明

擴充泛型型別

類型約束

關聯類別型

擴充以後類型來確定關聯類別型

系統整理 精講 swift 泛型

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.