Swift—泛型(上)
1.泛型
泛型是一种非常灵活的语法,允许程序在函数、枚举、结构体、类中定义类型形参,这种类型形参实际代表的类型是动态改变的——程序可以等到真正使用这些函数、枚举、结构体、类时才为这些类型形参传入实际的类型。
2.泛型函数
就是在声明函数时定义一个或多个类型占位符。语法格式如下:
func 函数名<T, S> (形参列表) -> 返回值类型
{
//函数体
}
func copyArray <T> (src : [T]) -> [T] { var arr : [T] = [] for element in src { arr.append(element) } return arr; } print(copyArray([1, 2, 3, 4])) //此时T的类型代表Int //输出 [1, 2, 3, 4] print(copyArray(["g", "h", "k"])) //此时T的类型代表String //输出 ["g", "h", "k"]
定义多个类型参数,根据不同的运算返回不同元素类型。
func projection <SrcType, DescType>(src:[SrcType], fn:(SrcType) -> DescType) -> [DescType] { var result = [DescType]() for element in src { result.append(fn(element)) } return result } var books = ["AB", "BCDD", "CDE"] //计算字符串的长度 var fn :(String)->Int = {$0.characters.count} var proj = projection(books, fn: fn) print(proj) //输出[2, 4, 3] //字符串拼接 var fn1 :(String)->String = {"《" + $0 + "》"} var proj1 = projection(books, fn: fn1) print(proj1) //输出 ["《AB》", "《BCDD》", "《CDE》"]
3.泛型类型
泛型不仅可以在函数中使用,也可以在Swift的类型(枚举、结构体、类)中使用。(Swift内置支持的Array、Dictionary就是典型的泛型结构体)
结构体增加泛型参数
struct Rect<T> { var x : T var y : T var weight : T var height : T } var rect1 : Rect<Int>= Rect.init(x: 1, y: 1, weight: 14, height: 28) var rect2 : Rect<Double>= Rect.init(x: 1.0, y: 2.0, weight: 14.5, height: 28.2) print(rect1) //输出 Rect<Int>(x: 1, y: 1, weight: 14, height: 28) print(rect2) //输出 Rect<Double>(x: 1.0, y: 2.0, weight: 14.5, height: 28.2)
枚举增加泛型参数,是它们适应枚举中的关联值
enum Season<T> { case Winter(temp:T) case Summer case Spring case Autumn } var w : Season<Int>= Season.Winter(temp: 0) var w1 : Season<Double> = Season.Winter(temp: -0.2)
类增加泛型参数
class Apple <T> { var info : T init(info : T) { self.info = info } } var a = Apple<String>.init(info: "11") print(a.info) //输出 11 var a1 = Apple<Double>.init(info: 1.23) print(a1.info) //输出 1.23