Swift泛型

关键词:Swift, iOS, 泛型

概述

泛型代码让你能根据自定义的需求,编写出适用于任意类型的、灵活可复用的函数及类型。

示例

泛型的使用

//泛型限定数组内的元素为Item类型
func makeArray<Item>(itm:Item, num:Int) -> [Item] {
    //将itm重复num次,放入一个数组中
    var result = [Item]()
    for _ in 0 ..< num {
        result.append(itm)
    }
    return result
}

let res = makeArray(itm: "一个元素", num: 5)
print("得到的结果:\(res)")

泛型函数

使函数参数可以接收任何类型。

// 泛型函数。
// <AAA>表示,参数类型AAA只是一个占位符,不需要真实存在。使参数param可以处理任何类型的数据。
func showFan<AAA>(param:AAA) {
    print("传进来的参数:\(param)")
}
showFan(param: "aaa")

泛型命名类型参数

描述参数类型。

// 泛型命名类型参数。
// 限制了这个数组的元素类型。
var aArr: Array<String> = Array()
aArr.insert("aa", at: 0)
print("aArr内容:\(aArr)")

泛型类型约束

约束泛型继承的父类,或者遵循的协议。

// 泛型类型约束。约束泛型继承的父类,或者遵循的协议。
func someFunc<AAA: UIView, BBB: UITableViewDelegate>(param1: AAA, param2: BBB) {
    print("第一个参数:\(param1) 第二个参数:\(param2)")
}

泛型where语句

为泛型函数、下标、类型的类型参数定义一些强制要求。

// 泛型where语句
class someClass {
    var pro1: String?
    var pro2: Int?
}
//这里约束泛型Fan必须继承自someClass
func someFun1<Fan>(param1: Fan, param2: Fan) -> Void where Fan: someClass {
    print("参数:\(param1.pro1 ?? "")")
}
let cla1 = someClass()
cla1.pro1 = "aaa"
someFun1(param1: cla1, param2: cla1)