泛型技术
何为泛型?
简单理解:代码具有与类型无关的通用性
Objective-C在Xcode7开始,引入了泛型技术的应用
Swift支持相对比较完整的泛型技术
泛型函数
格式: func 函数名<类型>(参数列表)->返回类型 {}
如:
func my_swap<T>(inout value1 value1:T, inout value2:T) { var tmp:T tmp = value1 value1 = value2 value2 = tmp } var a1 = 10, a2 = 20 my_swap(value1: &a1, value2: &a2) print("a1=\(a1) a2=\(a2)") //a1=20 a2=10 var b1 = 3.14, b2 = 1.23 my_swap(value1: &b1, value2: &b2) //b1=1.23 b2=3.14
print("b1=\(b1) b2=\(b2)")
通用类型
实现类似Array、Dictionary可以存储各种数据类型
如实现一个栈结构体:
struct Stack<T> { private var items = [T]() var count:Int { get { return items.count } } mutating func push(value:T) { items.append(value) } mutating func pop()->T? { if items.count == 0 { return nil } else { return items.removeLast() } }
}
var s:Stack<Int> = Stack<Int>() s.push(10) s.push(20) s.push(30) print(s.pop()) print(s.pop())
print(s.pop())
再如一个简单的类类型
class A<T> {
var value:T?
}
var a = A<Double>()
a.value = 3.14
类型约束
语法:<T:协议1,协议2,...>
表示T通用类型必须是遵循了协议1、协议2的类型
如:Swift标准库的自带协议Equatable定义了==运算符重载函数的接口
并且大部分Swift的基本数据类型都遵循并实现了该协议
func isEqual<T:Equatable>(left:T, right:T)->Bool { return left == right }
print(isEqual(3.14, right: 3.15))
关联类型
关联类型的含义:在协议中使用泛型技术
如:
protocol AProtocol { typealias itemType //占位类型 func push(item:itemType) func pop()->itemType? } class A:AProtocol { var items = [Int]()
typealias itemType = Int //******
func push(item: itemType) { items.append(item) } func pop()->itemType? { if items.count == 0 { return nil } else { return items.removeLast() }
}