Swift泛型
泛型函数
func swapTwoValues(_ a:inout T,_ b:inout T){
let temp = a
a = b
b = temp
}
以上是交换两个任意相同类型值的泛型函数,
T
是一个占位命名类型
,swift不会查找命名为T
的实际类型。
占位类型T
是一种类型参数的示例,类型参数指定并命名为一个占位类型,并且紧随在函数名后面,使用一对尖括号括起来
,可以使用任何有效的标识符来作为类型参数名
(就是不一定非得用T,M、N、U、Y都可以)。
//Int
var str_a = "你好"
var str_b = "小明"
swapTwoValues(&str_a, &str_b)
print("开始变身:str_a = \(str_a), str_b = \(str_b)")
//string
var value_a = 3
var value_b = 90
swapTwoValues(&value_a, &value_b)
print("开始变身:value_a = \(value_a), value_b = \(value_b)")
在调用泛型函数swapTwoValues时,传入的参数可以是任意同类型的(Int、String、Double……都可以)
调用结果
开始变身:str_a = 小明, str_b = 你好
开始变身:value_a = 90, value_b = 3
类型约束
类型约束指定了一个必须继承自指定类的类型参数,或者遵循一个特定的协议或协议构成
作用于泛型函数的类型约束的语法:
func someFunction (someT : T, someU : U) {
//function body goes here
}
对类型参数M指定了Equatable
协议约束
//类型约束指定了一个必须继承自指定类的类型参数,或者遵循一个特定的协议或协议构成
func findIndex(array:[M],valueToFind:M) -> Int? {
for(index,value) in array.enumerated(){
//由于对类型参数M指定了遵循协议Equatable,所以findIndex函数中的参数可以使用等式符==进行比较
if value == valueToFind {
return index
}
}
return nil
}
findIndex查找数组中指定元素额的下标,数组元素可以是任意类型
由于对类型参数M指定了遵循协议Equatable
,所以findIndex函数中的参数可以使用等式符==
进行比较
let strArr = ["cat", "dog", "llama", "parakeet", "terrapin"]
let strResult = findIndex(array: strArr, valueToFind: "dog")
print("strResult \(String(describing: strResult))")
let valueArr = [8.8, 4.34, 1.00, 252.9]
let valueResult = findIndex(array: valueArr, valueToFind: 8.8)
print("valueResult \(String(describing: valueResult))")
调用结果
strResult Optional(1)
valueResult Optional(0)
可以在参数列表中通过where
语句定义参数的约束。
一个
where
语句能够使一个关联类型遵循一个特定的协议,以及那个特定的类型参数和关联类型可以是相同的。
可以写一个where
语句,紧跟在类型参数列表后面,where
语句后跟一个或者多个针对关联类型的约束,以及一个或多个类型和关联类型间的等价关系。
findIndexAtArr函数与findIndex是同价的
func findIndexAtArr(array:[M],valueToFind:M) -> Int? where M: Equatable {
for(index,value) in array.enumerated(){
if value == valueToFind {
return index
}
}
return nil
}