iOS开发 - 「Swift 学习」Swift泛型

Swift泛型

泛型函数

func swapTwoValues(_ a:inout T,_ b:inout T){
    let temp = a
    a = b
    b = temp
}

以上是交换两个任意相同类型值的泛型函数,T是一个占位命名类型,swift不会查找命名为T的实际类型。

占位类型T是一种类型参数的示例,类型参数指定并命名为一个占位类型,并且紧随在函数名后面,使用一对尖括号括起来可以使用任何有效的标识符来作为类型参数名(就是不一定非得用T,M、N、U、Y都可以)。

       //Int
        var str_a = "你好"
        var str_b = "小明"
        swapTwoValues(&str_a, &str_b)
        print("开始变身:str_a = \(str_a), str_b = \(str_b)")
        
        //string
        var value_a = 3
        var value_b = 90
        swapTwoValues(&value_a, &value_b)
        print("开始变身:value_a = \(value_a), value_b = \(value_b)")

在调用泛型函数swapTwoValues时,传入的参数可以是任意同类型的(Int、String、Double……都可以)

调用结果

开始变身:str_a = 小明, str_b = 你好
开始变身:value_a = 90, value_b = 3

类型约束

类型约束指定了一个必须继承自指定类的类型参数,或者遵循一个特定的协议或协议构成

作用于泛型函数的类型约束的语法:

func someFunction (someT : T, someU : U) {
    //function body goes here
}

对类型参数M指定了Equatable协议约束

//类型约束指定了一个必须继承自指定类的类型参数,或者遵循一个特定的协议或协议构成
func findIndex(array:[M],valueToFind:M) -> Int?  {
    for(index,value) in array.enumerated(){
//由于对类型参数M指定了遵循协议Equatable,所以findIndex函数中的参数可以使用等式符==进行比较
        if value == valueToFind {
            return index
        }
    }
    return nil
}

findIndex查找数组中指定元素额的下标,数组元素可以是任意类型
由于对类型参数M指定了遵循协议Equatable,所以findIndex函数中的参数可以使用等式符==进行比较

        let strArr = ["cat", "dog", "llama", "parakeet", "terrapin"]
        let strResult = findIndex(array: strArr, valueToFind: "dog")
        print("strResult \(String(describing: strResult))")
        
        let valueArr = [8.8, 4.34, 1.00, 252.9]
        let valueResult = findIndex(array: valueArr, valueToFind: 8.8)
        print("valueResult \(String(describing: valueResult))")

调用结果

strResult Optional(1)
valueResult Optional(0)

可以在参数列表中通过where语句定义参数的约束。

一个where语句能够使一个关联类型遵循一个特定的协议,以及那个特定的类型参数和关联类型可以是相同的。

可以写一个where语句,紧跟在类型参数列表后面,where语句后跟一个或者多个针对关联类型的约束,以及一个或多个类型和关联类型间的等价关系。

findIndexAtArr函数与findIndex是同价的

func findIndexAtArr(array:[M],valueToFind:M) -> Int?  where M: Equatable {
    for(index,value) in array.enumerated(){
        if value == valueToFind {
            return index
        }
    }
    return nil
}

\color{gray}{欢迎大佬儿来指正纠错,共同学习!!}

你可能感兴趣的:(iOS开发 - 「Swift 学习」Swift泛型)