1、泛型函数
泛型函数可以工作于任何函数类型:
func myswap<T>(inout a: T,inout b: T) {
let temp = a a = b b = temp}2、泛型类型
通常在泛型函数中,swift允许你定义你自己的泛型类型,这些自定义类,结构体和枚举作用于任何类型,如同:Array和Dictionary的用法。
这部分向你展示如何写一个泛型集类型--Stack(栈)。一个栈是一系列值域的集合,和Array(数组)类似,但其实一个比Swift的Array类型更多限制的集合,一个数组可以允许其里面任何位置插入/删除操作,二栈只允许在集合的末端添加新的项,代码如下:
struct Stack<Element> {
// var containers = [Element]()// mutating func push(e: Element) { // containers.append(e)// }// mutating func pop() -> Element { // return containers.removeLast()// }//}
3、泛型扩展
4、类型约束
Stack类型可以作用于任何类型不过有的时候对使用在泛型函数和泛型类型上的类型强制约束为某种特定类型是非常有用的,类型约束指定了一个必须继承自定义类的类型参数,或者遵循一个特定的协议或协议构成,代码如下
func index(arr:[Int],data: Int) ->Int {
// for (m,n) in arr.enumerate() { // if n == data { // return m// }// }// return -1//}
5、协议的关联类型
当定义一个协议时,有的时候声明一个或多个关联类型作为协议定义的一部分是非常有用的。一个关联类型给定作用于协议部分的类型一个节点名,(或别名)。作用于关联类型上实际类型是不需要指定的,直到该协议接受,关联类型被指定为typealisa关键字
protocol Container {
// typealias ItemType// //}//////extension Container where ItemType: MM { // var b: Int {return 5}//}//////extension Container where ItemType: NN { // var b: Int {return 6}//}//class TestTest: Container { // typealias ItemType = MMClass //如果这里改为MMClass,那么aaaa.b输出结构是5//}//class TestTest2: Container { // typealias ItemType = Int//}//let aaaa = TestTest2()//aaaa.b