swift泛型
2019-04-26 本文已影响0人
彭磊PL
一、swift泛型介绍
泛型是为swift编程灵活性的一种语法,在函数、枚举、结构体、类中都得到充分的应用,它的引入可以起到占位符的作用,当类型暂时不确定时,只有等到调用函数时才能确定具体类型的时候可以引入泛型。
我们实际上已经使用过泛型了,例如:swift的Array和Dictionary类型都是泛型集
二、swift泛型使用
swift泛型相关使用可分为以下几点:
1.泛型函数
2.泛型类型
3.泛型约束
4.泛型协议
1.泛型函数,函数参数或返回值类型用泛型表示
//泛型函数定义式
func 函数名<泛型1,泛型2,......>(形参列表)->返回值类型
{
// 函数体...
}
2.泛型类型,在定义类型时使用泛型
使用也和泛型函数差不多,就是再类型名后面加上<泛型1,泛型2,...>,然后在类型里面直接使用泛型即可
// 定义一个泛型结构体,用于压栈和出栈,泛型类型可以使用到类、结构体、枚举等各种类型
struct Stack<T> {
// 栈在这里是个数组存储形式,数组中存储的数据类型是泛型类型
var items = [T]()
// 因为压栈会修改实例值,需要加上mutating关键字
mutating func push(item: T) {
items.append(item)
}
// 因为出栈会修改实例值,需要加上mutating关键字
mutating func pop() -> T {
return items.removeLast()
}
}
3.泛型约束,为泛型类型添加约束
泛型约束大致分为以下几种:
1.继承约束,泛型类型必须是某个类的子类类型
2.协议约束,泛型类型必须遵循某种协议
3.条件约束,泛型类型必须满足某种条件
约束的大概使用格式
约束的大概使用格式
//继承约束使用格式
func 函数名<泛型: 继承父类>(参数列表) -> 返回值 {
//函数体,泛型类型是某个类的子类类型
}
//协议约束使用格式
func 函数名<泛型: 协议>(参数列表) -> 返回值 {
//函数体,泛型类型遵循某些协议
}
//条件约束使用格式
func 函数名<泛型1, 泛型2 where 条件>(参数列表) -> 返回值 {
//函数体,泛型类型满足某些条件
}
4.泛型协议和条件约束
//定义一个泛型协议,和其他泛型使用方式不同,这里泛型是以关联类型形式使用的
protocol Stackable{
//声明一个关联类型,使用typealias关键字
typealias ItemType
mutating func push(item:ItemType)
mutating func pop() -> ItemType
}
struct Stack<T>:Stackable{
var store = [T]()
mutating func push(item:T){//实现协议的push方法要求
store.append(item)
}
mutating func pop() -> T {//实现协议的pop方法要求
return store.removeLast()
}
}