美文网首页APP & programswift基础知识
iOS开发 - 「Swift 学习」Swift泛型

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

作者: 俺不是大佬儿 | 来源:发表于2022-04-11 11:36 被阅读0次

    Swift泛型

    泛型函数

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

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

    占位类型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<T : SomeClass, U : SomeProtocol> (someT : T, someU : U) {
        //function body goes here
    }
    

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

    //类型约束指定了一个必须继承自指定类的类型参数,或者遵循一个特定的协议或协议构成
    func findIndex<M:Equatable>(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<M>(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泛型

        本文链接:https://www.haomeiwen.com/subject/pidssrtx.html