1、泛型是将类型参数化,将类型作为参数
1.1 泛型函数
func swapValues<T>(_ a: inout T, _ b: inout T) {
(a, b) = (b, a)
}
func test<T1, T2>(_ a: inout T1, _ b: inout T2) {
(a, b) = (b, a)
}
var a = 10.0
var b = 20.0
swapValues(&a, &b)
var a = 10
var b = 20
var fn: (inout Int, inout Int) -> () = swapValues
fn(&a, &b)
var a1 = 10
var b1 = 20.0
var fn1: (inout Int, inout Double) -> () = test
fn1(&a1, &b1)
1.2 泛型类型
class Stack<E> {
var elements = [E]()
func push(_ element: E) {
elements.append(element)
}
func pop() -> E {
elements.removeLast()
}
func top() -> E {
elements.last!
}
func size() -> Int {
elements.count
}
}
var intStack = Stack<Int>()
var stringStack = Stack<String>()
var anyStack = Stack<Any>()
intStack.pop()
2、泛型本质
var a = 10
var b = 20
var fn: (inout Int, inout Int) -> () = swapValues
fn(&a, &b)
编译器会将 元数据(元类型) type of metadata for Swift.Int存入寄存器rdx中。