代码改变世界

Swift结构体和类

2019-07-27 21:45  iCoderHong  阅读(444)  评论(0编辑  收藏  举报

Swift结构体

在Swift标准中,绝大多数的公开的类型都是结构体,而枚举和类只占很小的一部分

 比如Bool、Int、Double、String、Array、Dictionary等常见的类型都是结构体

Swift定义一个结构体

 所有的结构体都有一个编译器自动生成的初始化器 编译器会根据情况,可能会为结构体生成多个初始化器

宗旨是为了保证初始化的结构体所有成员都有初始值

定义的Person结构体,编译器自动生成的初始化器

创建一个Person结构体实例

一旦在自定义结构体时自定义初始化器,编译器就不会载自动生成其它初始化器了

 结构体的内存结构

Swift类

类的定义和结构体类似,但是编译器并没有为类自动生成可以传入成员值的初始化构造器

如果类的所有成员都在定义的时候指定了初始值,编译器会为类生成无参的初始化器 成员的初始化是在这个初始化器中完成的

类的实例对象的内存结构 

 

结构体与类的本质区别

  1. 结构体、枚举都是值类型,类是引用类型
  2. 值类型赋值给var、let或者给函数传参,是直接将所有内容拷贝一份 产生了全新的副本,属于深拷贝
  3. 引用赋值给var、let或者给函数传参,是将内存地址拷贝一份,指向的是同一份内存空间,属于浅拷贝

在Swift标准库中,为了提升性能,String、Array、Dictionary、Set采取了Copy On Write的技术,仅当有"写"操作时,才会真正执行拷贝操作

对于标准库值类型的赋值操作,Swift能确保最佳性能,所以没必要为了保证最佳性能来避免赋值

建议:不需要修改的,尽量使用let