swift学习之类和结构体

类和结构体对比

Swift 中类和结构体有不少共同点。共同处在于:数组

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

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

  • 类能够继承
  • 类容许在运行时检查和解释一个类实例 的类型
  • 类的析构器容许个类实例释听任何其所分配的资源
  • 引用计数容许对一个类的屡次引用

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

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

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

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

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

结构体和枚举是值类型的

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

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

类是引用类型

与值类型不一样,引用类型在被赋予到一个变量 ,常量或者当作参数传递的时候,他的值 不会被拷贝。引用的是已存在的实例自己。继承

恒等运算符

由于类是引用类型,有可能有多个常量或者变量同时引用了一个实例。(对于值类型来讲,不会出现这种问题,由于他们的值在用到时老是拷贝一份),有时会有需求判断两个变量或者常量是否引用了同一个实例。为此 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官方教程

相关文章
相关标签/搜索