泛型是面向对象里另外一个重要的概念,除了多态,它进一步增加的代码的重用范围,而对于 Swift 语言来说,泛型贯穿了它的始终。
从 Print() 说起
我们从上课的第一天开始就在使用这个全局函数了,它让我们得以在屏幕上显示语句,用起来十分简单,传入一个字符串即可。
传入字符串就显示字符串,传入整形就显示数字……
等等!作为一个函数,它怎么能接收两种不同的参数!
好吧我们使用万能的 cmd 按钮,点进去看看这个 print() 函数究竟是怎么声明的:
1 |
public func print<T>(value: T) |
如果没有泛型
现在,让我们来写一个交换两个数字的方法(抄自苹果官方手册)
1 2 3 4 5 |
func swapTwoInts(inout a: Int, inout _ b: Int) { let temporaryA = a a = b b = temporaryA } |
如果要使用,是这样用的:
1 2 3 |
var someInt = 3 var anotherInt = 107 swapTwoInts(&someInt, &anotherInt) |
现在我要交换两个字符串:
1 2 3 4 5 |
func swapTwoStrings(inout a: String, inout _ b: String) { let temporaryA = a a = b b = temporaryA } |
我还要交换两个双精度浮点数:
1 2 3 4 5 |
func swapTwoDoubles(inout a: Double, inout _ b: Double) { let temporaryA = a a = b b = temporaryA } |
也就是说,现在我们分别拥有了 Int,String ,Double 版本的交换位置方法——它们的唯一区别就是类型不同。这不符合我们进行开发的原则——相同的内容重复太多——类型千千万,还不包括我们自己定义的类型,都这么交换,那……
使用泛型来救场
1 2 3 4 5 |
func swapTwoValues<T>(inout a: T, inout _ b: T) { let temporaryA = a a = b b = temporaryA } |
这样,不论是 Int 还是 String,甚至是你自己写的类型,都可以一步到位了。
1 2 3 4 5 6 7 8 9 |
var someInt = 3 var anotherInt = 107 swapTwoValues(&someInt, &anotherInt) // someInt is now 107, and anotherInt is now 3 var someString = "hello" var anotherString = "world" swapTwoValues(&someString, &anotherString) // someString is now "world", and anotherString is now "hello" |
泛型
我们用 T 来代表一个占位符——说白了它就是一个通配符,我们不限制传入类型的参数,唯一的要求就是这两个参数的类型得是一致的。然后我们在方法的后边用尖括号<>括起来一个占位符,代表这个方法是一个泛型方法。
下面,我们再来用泛型实现一个结构体:
1 2 3 4 5 6 7 8 9 |
struct IntStack { var items = [Int]() mutating func push(item: Int) { items.append(item) } mutating func pop() -> Int { return items.removeLast() } } |
这是一个整形的栈——关于栈的概念我们已经讲过,面向对象当中的方法执行过程就是在栈中完成的,现在我们写一个整形的栈,这包含了出栈和入栈的两个方法——显然,这个结构体也可以改造成其他类型的栈……我们现在让它以泛型来实现:
1 2 3 4 5 6 7 8 9 |
struct Stack<Element> { var items = [Element]() mutating func push(item: Element) { items.append(item) } mutating func pop() -> Element { return items.removeLast() } } |
你看,这次我们用 Element 作为占位符了,关键是用<>表示出来。
这样,我们只需要在生成实例的时候表明类型,这个结构体就能够被对应的类型所使用了。
转载请保留出处和原文链接:https://www.logcg.com/archives/1138.html