在上面的泛型函数例子中,占位符T是类型参数的一个例子。类型参数指定并命名一个占位符类型,并用<>包裹,放在函数名后面。一旦一个参数类型确定,就可以指定参数类型,或者返回值的类型,还可以用作函数体的注释类型。在调用的时候会被实际的类型替代,如传递的是Int,就替换为Int,如果传入的是Double类型就替换为Double等等
5.泛型类型
除了定义泛型函数,还可以定义泛型类型。如Array,Dictionary的用法
struct IntStack{
var items = [Int]()
//压栈
mutating func push(item:Int){
items .append(item)
}
//出栈
mutating func pop()->Int{
return items.removeLast()
}
}
这个是一个泛型版本的栈
struct Stack{
var items = [Element]()
mutating func push(item:Element){
items.append(item)
}
mutating func pop()->Element{
return items.removeLast()
}
}
7.类型约束
在上面的SwapTwoVlues 和 Stack中,可以作用任何类型。但是也可以添加一个约束,比如指定一个类型必须采纳某协议或者是指定类等。在Swift中(Bool,Int,Doube,String默认都是哈希的),Dictionary的键就需要必须是可哈希的,方便字典查找是否已包含某个键的值。
类型约束语法
可以在类型参数名后面加一个类型或者协议名,通过冒号隔开,多个类型参数之间用逗号隔开
func somFuntion(someClass:C,someProtocol:P){
}
在定义的这个函数中,有两个类型约束,第一次类型参数C代表是某个类,第二个参数P代表某个协议。
func findIndex (array:[S],_ valueToFind:S)->Int? {
for (index,value) in array.enumerate(){
if value == valueToFind { //如果没指定S:Equatable 这句话会编译不通过
return index
}
}
return nil
}
在这个泛型例子中,不是所有的类型都可以 用 == 来比较的,所有必须指定泛型类型参数的约束为 Swift提供的 Equatable 协议,这表示S代表的类型必须是支持 Equatable 协议的。所有的Swift标准类型默认都是支持Equatable协议的.
网友评论