泛型的意思

在上面的泛型函数例子中,占位符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协议的.

你可能感兴趣的:(泛型的意思)