购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

Tip 14

typealias和泛型接口

typealias是用来为已经存在的类型重新定义名字的,通过命名,可以使代码变得更加清晰。使用的语法也很简单,使用typealias关键字像使用普通的赋值语句一样,可以将某个已经存在的类型赋值为新的名字。比如在计算二维平面上的距离和位置的时候,我们一般使用Double来表示距离,用CGPoint来表示位置:

虽然在数学上和最后的程序运行上都没什么问题,但是阅读和维护的时候总是觉得有哪里不对。因为我们没有将数学抽象和实际问题结合起来,使得在阅读代码时我们还需要在大脑中进行一次额外的转换:CGPoint代表一个点,而这个点就是在定义的坐标系里的 位置 ;Double是一个数字,它代表两个点之间的 距离

如果我们使用typealias,就可以将这种转换直接写在代码里,从而减轻阅读和维护的负担:

同样的代码,在typealias的帮助下,读起来就轻松多了。可能仅凭这个简单例子不会有特别多的体会,但是当遇到复杂的实际问题时,你就可以不再关心并去思考自己代码里那些成堆的Int或String等基本类型到底代表的是什么了,可以省下不少“脑细胞”。

对于普通类型并没有什么难点,但是在涉及泛型时,情况就不太一样了。首先,typealias是单一的,也就是说你必须指定将某个特定的类型通过typealias赋值为新名字,而不能将整个泛型类型进行重命名。下面这样的命名都是无法通过编译的:

这是错误代码

一旦泛型类型的确定性得到保证后,我们就可以重命名了:

另外值得一提的是,Swift中是没有泛型接口的,但是使用typealias,我们可以在接口里定义一个必须实现的别名,这在一定范围内也算一种折中方案。比如在GeneratorType和SequenceType这两个接口中,Swift都用到了这个技巧,来为接口确定一个使用的类似泛型的特性:

在实现这些接口时,我们不仅需要实现指定的方法,还要实现对应的typealias,这其实是一种对于接口适用范围的抽象和约束。 uKmqqs1Pg84UJ01AKN25EH1Yleji1666/bfP2tN4t48ns0jdEeVjfcI3c/NqfzGQ

点击中间区域
呼出菜单
上一章
目录
下一章
×

打开