Swift泛型和泛型函数
来源:互联网 发布:unity3d游戏开发 编辑:程序博客网 时间:2024/04/29 05:13
泛型(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协议的。
修改代码如下:
func isEquals<T: Comparable>(a: T, b: T) -> Bool { ② return (a == b)}
我们需要在T占位符后面添加冒号和协议类型,这种表示方式被称为泛型约束,它能够替换T的类型。在本例中,T的类型必须遵守Comparable协议的具体类。
我们可以通过下列代码测试第②行代码定义的函数:
let n1 = 200let n2 = 100println(isEquals(n1, n2))let s1 = "ABC1"let s2 = "ABC1"println(isEquals(s1, s2))
分别传递两个Int参数和String参数进行比较,运行结果如下:
false
true
运行结果无需解释了。泛型在很多计算机语言中都有采用,基本含义都是类似的,但是小的差别还是有的。
欢迎关注智捷iOS课堂微信公共平台
- Swift泛型和泛型函数
- Swift 泛型函数 类型约束(十三)
- Swift 系统学习 13 泛型 这里是和函数一起讲的泛型
- Swift:元组、typealias和泛型
- Swift-泛型学习和实例总结
- Swift-泛型学习和实例总结
- Swift 函数型参数
- Swift 泛型参数
- Swift 泛型返回
- Swift 中的泛型
- Swift学习之路 -- 协议、扩展和泛型
- [Swift]:快速学习笔记5 扩展和泛型
- Swift学习之泛型
- 浅谈 Swift 中的泛型
- Swift 泛型教程入门
- 窥探Swift之使用Web浏览器编译Swift代码以及Swift中的泛型
- swift 函数和闭包
- Swift函数和闭包
- 改变世界的17个等式
- gSoap实现ONVIF中xsd__anyType到具体结构类型的转换
- 滤波器设计指标
- 数字信号处理中各种频率关系
- 背包问题
- Swift泛型和泛型函数
- C语言之指针专题一:指针变量和指针所指向的内存空间是两个不同的概念
- 学习FPGA的网站推荐
- 酷炫:6个有趣的Linux命令
- 2014年,转变的一年
- poj 1157 LITTLE SHOP OF FLOWERS(动态规划:数塔加强)
- 常见算法在实际项目中的应用
- phonegap 教程之环境搭建
- LeetCode 32 Triangle