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

Tip 21

多类型和容器

Swift中常用的原生容器类型有三种,分别是Array、Dictionay和Set:

它们都是泛型的,也就是说我们在一个集合中只能放同一个类型的元素,比如:

如果我们要把不相关的类型放到同一个容器类型中,比较容易想到的是使用 Any或者AnyObject(见第30页),或者使用NSArray:

这样的转换会造成部分信息的损失,我们从容器中取值时只能得到信息完全丢失后的结果,在使用时还需要进行一次类型转换。这其实是在无其他可选方案后的最差选择,因为使用这样的转换的话,编译器就不能再给我们提供警告信息了。我们可以随意地将任意对象添加进容器,也可以将容器中取出的值转换为任意类型,这是一件十分危险的事情:

其实我们注意到,Any其实是protocol,而不是具体的某个类型。因此在容器类型泛型的帮助下,我们不仅可以在容器中添加同一具体类型的对象,也可以添加实现了同一接口的类型的对象。绝大多数情况下,我们想要放入一个容器中的元素或多或少会有某些共同点,这就使得用接口来规定容器类型会很有用。比如在上面的例子中,如果我们需要的是打印出容器内的元素的description,可能我们更倾向于将数组声明为[CustomStringConvertible]的:

这种方法虽然也损失了一部分类型信息,但是相对于Any或者AnyObject还是改善很多,在对象存在某种共同特性的情况下无疑是最方便的。另一种做法是使用enum可以带有值的特点,将类型信息封装到特定的enum中。下面的代码封装了Int或者String类型:

通过这种方法,我们完整地在编译时保留了不同类型的信息。为了方便,我们甚至可以进一步为IntOrString使用字面量转换(见第19页)的方法编写简单的获取方式,但那是另外一个故事了。 D8DsXpKXrBY6VyIXtzk4+Xau4lOc1YDfyda8AQ+bzYWAXWQBPnZUd9NRHbVhl8pJ

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