• Swift泛型和泛型函数


    泛型(generic)可以使我们在程序代码中定义一些可变的部分,在运行的时候指定。使用泛型可以最大限度地重用代码、保护类型的安全以及提高性能。在Swift集合类中,已经采用了泛型。
    一、一个问题的思考
    怎样定义一个函数来判断两个参数是否相等呢?
    如果参数是Int类型,则函数定义如下:
    func isEqualsInt(a:Int, b:Int) -> Bool {
        return (a == b)
    }
    这个函数参数列表是两个Int类型,它只能比较两个Int类型参数是否相等。如果我们想比较两个Double类型是否相等,可以修改上面定义的函数如下:
    func isEqualsDouble(a:Double, b:Double) -> Bool {
        return (a == b)
    }
    这个函数参数列表是两个Double类型,它只能比较两个Double类型参数是否相等。如果我们想比较两个String类型是否相等,可以修改上面定义的函数如下:
    func isEqualsString(a:String, b:String) -> Bool {
        return (a == b)
    }
    以上我们分别对3种不同的类型进行了比较,定义了类似的3个函数。那么我们是否可以定义1个函数能够比较3种不同的类型呢?如果isEqualsInt、isEqualsDouble和isEqualsString这3个函数名字后面的Int、Double和String是可变的,那么这些可变部分是与参数类型关联的。 
    二、泛型函数
    我们可以改造上面的函数,修改内容如下:
    func isEquals<T>(a: T, b: T) -> Bool {   ①
        return (a == b)
    }
    在函数名isEquals后面添加<T>,参数的类型也被声明为T,T称为占位符,函数在每次调用时传入实际类型才能决定T所代表的类型。如果有多个不同类型,可以使用其他大写字母,一般情况下我们习惯于使用U字母,但是你也可以使用其他的字母。多个占位符用逗号“,”分隔,示例如下:
    func isEquals<T, U>(a: T, b: U) -> Bool {...}
    占位符不仅仅可以替代参数类型,还可以替代返回值类型。示例代码如下:
    func isEquals<T>(a: T, b: T) -> T {...}
    事实上,上面第①行的函数在编译时会有错误发生,这是因为并不是所有的类型都具有“可比性”,它们必须遵守Comparable协议实现类型。Comparable协议表示可比较的,在Swift中,基本数据类型以及字符串都是遵守Comparable协议的。
    修改代码如下:

    [html] view plaincopy
     
    1. func isEquals<T: Comparable>(a: T, b: T) -> Bool {  ②  
    2.     return (a == b)  
    3. }  



    我们需要在T占位符后面添加冒号和协议类型,这种表示方式被称为泛型约束,它能够替换T的类型。在本例中,T的类型必须遵守Comparable协议的具体类。
    我们可以通过下列代码测试第②行代码定义的函数:

    [html] view plaincopy
     
    1. let n1 = 200  
    2. let n2 = 100  
    3.   
    4.   
    5. println(isEquals(n1, n2))  
    6.   
    7.   
    8. let s1 = "ABC1"  
    9. let s2 = "ABC1"  
    10.   
    11.   
    12. println(isEquals(s1, s2))  



    分别传递两个Int参数和String参数进行比较,运行结果如下:
    false
    true
    运行结果无需解释了。泛型在很多计算机语言中都有采用,基本含义都是类似的,但是小的差别还是有的。

    更多内容请关注国内第一本Swift图书《Swift开发指南》
    本书交流讨论网站:http://www.51work6.com/swift.php
    欢迎加入Swift技术讨论群:362298485

    欢迎关注智捷iOS课堂微信公共平台

  • 相关阅读:
    解决electron-vue中无法使用Element的Tooltip组件
    解决Electron安装包下载慢的问题
    虚拟机VirtualBox 共享挂载问题:mount: /mnt/xxx: wrong fs type, bad option, bad superblock on xxx
    git 设置和取消代理
    (转载)数据库连接池到底应该设多大?这篇文章可能会颠覆你的认知
    MySQL主主复制+MMM实现高可用
    Mysql5.6主从热备配置
    java 启动 shell脚本
    redis批量删除key
    spring mvc异常统一处理(ControllerAdvice注解)
  • 原文地址:https://www.cnblogs.com/iOS-Blog/p/3942237.html
Copyright © 2020-2023  润新知