1)默认情况下使用 结构体。 Default
2) 需要 Objective-C 互操作性时,请使用 类。
3)需要控制数据模型的 同一性 时,请使用类
4)需要通过 协议继承 共享 行为实现 时,请使用 结构体
一、 默认选择结构体
使用结构体表示常见数据类型。Swift中的结构体包含许多功能,这些功能仅限于其他语言中的类:它们可以包含存储属性,计算属性和方法。而且,Swift结构体可以通过遵守协议来获得默认的实现行为。Swift标准库和Foundation中对经常使用的数据类型都是用结构体实现的,例如数字,字符串,数组和字典。
使用结构体可以更轻松地推理代码片段,而无需考虑应用程序的整体状态。由于结构体是值类型(与类不同),因此对结构体的局部更改对应用程序的其余部分不可见,除非您有意将这些更改作为应用程序流程的一部分进行交流。结果,您可以查看一段代码,并更有信心对该部分中的实例进行显式更改,而不是通过与切向相关的函数调用进行不可见的更改。
二、需要与Objective-C互操作性时使用类
如果您使用需要处理数据的Objective-CAPI,或者需要适应你的数据模型为继承或者定义在Objective-C框架中的类,则可能需要使用类和类继承来对数据进行建模。例如,许多Objective-C框架都公开了您希望子类化的类。
三、需要控制同一性时使用类
Swift中的类带有内置的同一性概念,因为它们是引用类型。这意味着当两个不同的类实例为其每个存储的属性具有相同的值时,同一运算符(===)仍将它们视为不同。这也意味着,当您在应用程序中共享一个类实例时,对该实例所做的更改对于包含对该实例的引用的代码的每一部分都是可见的。当您需要实例具有这种同一性时,请使用类。常见的用例是文件管理,网络连接和共享的硬件中介,如CBCentralManager。
例如,如果您有一个表示本地数据库连接的类型,则用于管理对该数据库访问权限的代码需要完全控制从应用程序查看的数据库状态。在这种情况下,使用一个类是适当的,但是一定要限制应用程序的哪些部分可以访问共享数据库对象。
四、当您不控制同一性时使用结构体
当你的数据模型包含的信息不需要同一性时,请使用结构体。
例如,在查询远程数据库的应用中,实例的同一性可以完全由外部实体拥有,并可以通过标识符进行通信。如果应用程序模型的一致性存储在服务器上,则可以将记录建模为带有标识符的结构体。在下面的示例中,jsonResponse包含来自服务器的编码PenPalRecord实例:
像PenPalRecord模型类型的本地更改是非常有用的。例如,一个应用可能会响应用户反馈而推荐多个不同的penpals。因为该PenPalRecord结构体无法控制基础数据库记录的同一性,所以不存在对本地PenPalRecord实例所做的更改意外更改数据库中值的风险。
如果应用程序的另一部分发生更改myNickname,并将更改请求提交给服务器,则更改不会错误地接受最近拒绝的penpals建议。因为该myID属性被声明为常量,所以不能在本地更改。因此,对数据库的请求不会意外更改错误的记录。
五、使用结构体和协议建模来继承和共享行为
结构体和类都支持一种继承形式。结构体和协议只能采用协议;他们不能从类继承。但是,还可以使用协议继承和结构体对可以使用类继承构建的继承层次结构体进行建模。
如果要从头开始建立继承关系,则最好使用协议继承。协议允许类,结构体和枚举参与继承,而类继承仅与其他类兼容。当您选择如何对数据建模时,请先尝试使用协议继承构建数据类型的层次结构体,然后在结构体中采用这些协议。
参考作者:https://www.jianshu.com/p/d00e86a2f90a
网友评论