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