1 泛型的用处
swift是强类型语言,很多地方受到类型的限制,比如函数中参数的类型是固定的,调用者必须使用规定的类型。
有时候这种限制会导致额外的工作,比如下面这个函数:交换两个int类型数的值,当我们需要交换两个double类型数的值的时候又要重新定义一个函数
其实这两个函数功能相同,只是类型不同,却要定义两个函数。这是强类型带来的麻烦。
//这个函数只能交换两个int类型数的值
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
let temporaryA = a
a = b
b = temporaryA
}
//交换两个Double类型数的值
func swapTwoDoubles(_ a: inout Double, _ b: inout Double) {
let temporaryA = a
a = b
b = temporaryA
}
泛型就是用来解决类似上面这种麻烦的,使得函数更加通用。
//函数内部其实没有用到与类型相关的东西
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
let temporaryA = a
a = b
b = temporaryA
}
2 泛型集合
//这个Stack可以存取任何类型,
struct Stack<Element> {
var items = [Element]()
mutating func push(_ item: Element) {
items.append(item)
}
mutating func pop() -> Element {
return items.removeLast()
}
}
3 泛型的限制
可以对这个T加上点儿限制
下面方法的参数可以使任何实现了Equatable协议的变量
func judgeEqual<T: Equatable>(a: T, b: T) -> Bool {
if a==b {
return true
} else {
return false
}
}