swift学习之类和结构体

ぃ、小莉子 提交于 2019-12-16 10:53:25

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

类和结构体对比

Swift 中类和结构体有很多共同点。共同处在于:

  • 定义属性用于存储值
  • 定义方法用于提供功能
  • 定义下标操作使得可以通过下标语法来访问实例所包含的值
  • 定义构造器用于生成初始化值
  • 通过扩展以增加默认实现的功能
  • 实现协议已提供某种标准功能

与结构体对比类还有如下的附加功能:

  • 类可以继承
  • 类允许在运行时检查和解释一个类实例 的类型
  • 类的析构器允许个类实例释放任何其所分配的资源
  • 引用计数允许对一个类的多次引用

注意:结构体总是通过被复制的方式在代码中传递,不适用引用计数。这是类和结构体的区别之一

类和结构体都可以使用点语法访问其属性。

注意:与Objective-C不同,Swift允许直接设置结构体的子属性的值。比如在OC中 tableView.frame.origin.x = 200这种写法就会报语法错误,而在Swift中则不会。

结构体都一个自动生成的成员逐一构造器,用于初始化结构体实例中的属性。如:

CGRect.init(origin: , size: ) 然而类却不会自动生成。

结构体和枚举是值类型的

值类型被赋予一个变量,常量或者当做参数传递给函数的时候,其值会被拷贝。

在 Swift 中,所有的基本类型:整数(Integer)、浮 点数(floating-point)、布尔值(Boolean)、字符串(string)、数组(array)和字典(dictionary),都是 值类型,并且在底层都是以结构体的形式所实现。同样所有的结构体和枚举类型都是值类型。这意味着它们的实例,以及实例中所包含的任何值类型属性,在代码中传递的时候都会被复制。

类是引用类型

与值类型不同,引用类型在被赋予到一个变量 ,常量或者当做参数传递的时候,他的值 不会被拷贝。引用的是已存在的实例本身。

恒等运算符

因为类是引用类型,有可能有多个常量或者变量同时引用了一个实例。(对于值类型来说,不会出现这种问题,因为他们的值在用到时总是拷贝一份),有时会有需求判断两个变量或者常量是否引用了同一个实例。为此 Swift内建了两个恒等运算符:

  • 等价于 ===
  • 不等价于 !==

这两个运算符用来检测两个常量或者变量是否引用同一个实例。

注意: “等价于”(用三个等号表示, === )与“等于”(用两个等号表示, == )的不同:

1.“等价于”表示两个类类型(class type)的常量或者变量引用同一个类实例。

2.“等于”表示两个实例的值“相等”或“相同”,判定时要遵照设计者定义的评判标准,因此相对于“相 等”来说,这是一种更加合适的叫法。

类和结构体的选择

结构体和类都可以定义数据类型。结构体的实例总是通过值传递,而类的实例总是通过引用传递。这表明两者的使用场景不同。当我们需要构建项目中的一个数据结构或者功能的时候,需要决定是使用结构体还是类。

一般情况下,符合以下一条或者几条的时候可以考虑使用结构体:

  • 该数据结构的主要目的是用来封装少量相关的简单数据。
  • 数据结构的实例在赋值或者传递时,封装的数据将会被拷贝而不是被引用。
  • 该数据结构中存储的值类型属性,也应该被拷贝而不是被引用。
  • 该数据结构不需要去继承一个既有的类型的属性或者行为。

举例来说一下情况适合使用结构体:

1.几何图形的大小,封装一个width和height属性,两者类型均为CGFloat。

2.三维坐标系一点,封装x,y,z属性,三者均为Double类型。

在其他的案例中,定义一个类,生成一个他的实例,并通过引用来传递。实际中这意味着绝大部分的数据结构都因该是类,而不是结构体。

String、Array和Dictionary类型的赋值与复制行为。

Swift 中,许多基本类型,诸如 String , Array 和 Dictionary 类型均以结构体的形式实现。这意味着被赋值给 新的常量或变量,或者被传入函数或方法中时,它们的值会被拷贝。

OC 中 NSString , NSArray 和 NSDictionary 类型均以类的形式实现,而并非结构体。它们在被赋值或 者被传入函数或方法时,不会发生值拷贝(除非你主动拷贝一份),而是传递现有实例的引用。

注意:以上是对字符串、数组、字典的“拷贝”行为的描述。在你的代码中,拷贝行为看起来似乎总会发生。然而,Swift 在幕后只在绝对必要时才执行实际的拷贝。Swift 管理所有的值拷贝以确保性能最优化,所以你没必要去回避赋值来保证性能最优化。

 

--------

以上参考Swift官方教程

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!