泛型

泛型是面向对象里另外一个重要的概念,除了多态,它进一步增加的代码的重用范围,而对于 Swift 语言来说,泛型贯穿了它的始终。

从 Print() 说起

我们从上课的第一天开始就在使用这个全局函数了,它让我们得以在屏幕上显示语句,用起来十分简单,传入一个字符串即可。

传入字符串就显示字符串,传入整形就显示数字……

等等!作为一个函数,它怎么能接收两种不同的参数!

好吧我们使用万能的 cmd 按钮,点进去看看这个 print() 函数究竟是怎么声明的:

如果没有泛型

现在,让我们来写一个交换两个数字的方法(抄自苹果官方手册)

如果要使用,是这样用的:

现在我要交换两个字符串:

我还要交换两个双精度浮点数:

也就是说,现在我们分别拥有了 Int,String ,Double 版本的交换位置方法——它们的唯一区别就是类型不同。这不符合我们进行开发的原则——相同的内容重复太多——类型千千万,还不包括我们自己定义的类型,都这么交换,那……

使用泛型来救场

这样,不论是 Int 还是 String,甚至是你自己写的类型,都可以一步到位了。

 

泛型

我们用 T 来代表一个占位符——说白了它就是一个通配符,我们不限制传入类型的参数,唯一的要求就是这两个参数的类型得是一致的。然后我们在方法的后边用尖括号<>括起来一个占位符,代表这个方法是一个泛型方法。

下面,我们再来用泛型实现一个结构体:

这是一个整形的栈——关于栈的概念我们已经讲过,面向对象当中的方法执行过程就是在栈中完成的,现在我们写一个整形的栈,这包含了出栈和入栈的两个方法——显然,这个结构体也可以改造成其他类型的栈……我们现在让它以泛型来实现:

你看,这次我们用 Element 作为占位符了,关键是用<>表示出来。

这样,我们只需要在生成实例的时候表明类型,这个结构体就能够被对应的类型所使用了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注