1、数据源中的同构与异构
对于 Swift 的集合数据来说,有同构和异构之分。
- 如果你需要讨论一群鸟类或者一批飞机,那么这样的数据是同构的,比如包含鸟类的数组
[Bird]
和包含飞机的数组[Airplane]
。 - 有时候你想探讨的是这些空中家伙的共性 “飞翔”,因此你的数据源可能同时包含
Bird
和Airplane
,这样的数据源叫做异构数据。
- 如果你需要讨论一群鸟类或者一批飞机,那么这样的数据是同构的,比如包含鸟类的数组
1.1 使用协议构建异构数据
协议是描述一个事物属性的最小力度划分,Swift 协议的一个重要作用就是构建异构数据,数组的定义是泛型的,当你把协议作为类型去初始化一个数组的时候,实际是为数组中的成员的泛型定义增加了一层协议的约束。
使用协议实现数据的异构除了功能划分更明确、粒度更小之外,还有一个好处是运行的效率要高于使用类的继承实现的数据异构。Swift 作为一门强类型语言,继承的安全性检查规则比较复杂,运行时的类型转换(特指父类与子类的转换)并不高,而协议不会保存数据,协议的实现只需要参考上下文,所以在运行速度上更胜一筹。使用协议实现异构,者也是苹果官方推荐的写法。
使用协议构建异构数据
// 创建协议 protocol CanFly { func fly() } // 创建异构数据源类型 struct Bird: CanFly { var name = "" func fly() { print("bird fly") } } struct Airplane: CanFly { var company = "" func fly() { print("airplane fly") } }
// 创建异构的数组 let flyArray: [CanFly] = [ // 指定数据上下文类型 Bird(name: "maque"), Airplane(company: "zhongguodongfanghangkong") ] for f in flyArray { f.fly()