1. 节点泛型
Swift 中,有参数的函数必须指定参数的类型,现在有几个同名的函数实现相似的功能,但是参数的类型不同,例如:
func show(para: Int) {
print("Hello \(para)")
}
func show(para: String) {
print("Hello \(para)")
}
func show(para: Double) {
print("Hello \(para)")
}
虽然系统可以根据参数类型调用不同的函数,但在定义上这种方法过于冗余。下面是与上列有相同功能的泛型函数定义:
func shwo<T>(para: T) {
print("Hello \(para)")
}
我们可以给这个泛型函数传入不同类型的值:
show("小明")//输出 ”Hello 小明“
show(11)//输出”Hello 11“
泛型函数在声明时使用了节点类型命名(通常情况下用字字母 T、U、V、这样的大写字母来表示)来代替实际类型名。节点类型在定义时不表示任何具体类型,在函数被调用时根据传入的实际类型来指定自身的类型。
如果函数的泛型列表中只有一个T,虽然具体类型不需要指定,但是每个节点类型的参数必须是相同类型的。
如果要定义多个不同类型的泛型,则需要在尖括号中加入多个节点:<T、U、V…>,在泛型函数名后面插入节点的声明
2.泛型协议
protocol SomeProtocol {
associatedtype Element
func elementMethod1(element: Element)
func elementMethod2(element: Element)
}
这里虽然没有出现节点语法,但是上面的协议却是一个不折不扣的泛型协议,Element 起到了占位符的作用,指示了某种类型。
3.泛型对象
struct TestStruct<T: Comparable> {
func elementMethond1(element: T) {
print("\(element)")
}
}
let test = TestStruct<Int>()
test.elementMethond1(element: 1)