泛型

136 阅读1分钟

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中。