美文网首页
Swift3.0 - 泛型

Swift3.0 - 泛型

作者: Flum_X | 来源:发表于2017-08-22 11:27 被阅读0次
    • 泛型所解决的问题

    先来看几个函数:

    func swapTwoInts(_ a: inout Int, _ b: inout Int) { let temporaryA = a
    a= b
    b = temporaryA
    }
    
    func swapTwoStrings(_ a: inout String, _ b: inout String) { let temporaryA = a
    a= b
    b = temporaryA
    }
    
    func swapTwoDoubles(_ a: inout Double, _ b: inout Double) { let temporaryA = a
    a= b
    b = temporaryA
    }
    

    上面三个函数的功能都是相同的,即交换两个变量的值,唯一不同之处就在于传入的变量类型不同,分别是 IntStringDouble 。而实际应用中,为了实现相同的功能却要实现多个函数,这显然不是我们最想要的,幸运的是,泛型代码很好的解决了这个问题。

    注意:
    在上面三个函数中, ab 类型相同。如果 ab 类型不同,那它们俩就不能互换值。Swift 是类型安全的语言,所以它不允许一个 String 类型的变量和一个 Double 类型的变量互换值。试图这样做将导致编译错误。

    泛型代码实现:

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

    这个函数的泛型版本使用了占位类型名(在这里用字母 T 来表示)来代替实际类型名(例如 IntStringDouble )。占位类型名没有指明 T 必须是什么类型,但是它指明了 ab 必须是同一类型 T ,无论 T 代表什么类型。只有swapTwoValues(_:_:) 函数在调用时,才能根据所传入的实际类型决定 T 所代表的类型。

    另外一个不同之处在于这个泛型函数名( swapTwoValues(_:_:) )后面跟着占位类型名( T ),并用尖括号括起 来( <T> )。这个尖括号告诉 Swift 那个 TswapTwoValues(_:_:) 函数定义内的一个占位类型名,因此 Swift 不会去查找名为 T 的实际类型。

    相关文章

      网友评论

          本文标题:Swift3.0 - 泛型

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