swift 类型 学习整理

1. 类和结构体的区别

类和结构体有许多相同之处,也有许多不同之处。

二者区别如下:

  1. 类可以继承,结构体不可以
  2. 可以让一个类的实例来反初始化,释放存储空间,结构体做不到
  3. 类的对象是引用类型,而结构体是值类型。所以类的赋值是传递引用,结构体则是传值。

相同点:

  1. 类和结构体都可以扩展
  2. 定义属性用于储存值
  3. 定义方法用于提供功能
  4. 定义下标用于通过下标语法访问值
  5. 定义初始化器用于生成初始化值

2. 值类型与引用类型

stack & heap
内存(RAM)中有两个区域,栈区(stack)和堆区(heap)。在 Swift 中,值类型,存放在栈区;引用类型,存放在堆区。

值类型(Value Type)
值类型,即每个实例保持一份数据拷贝。

  • 在 Swift 中,典型的有 struct,enum,以及 tuple 都是值类型。而平时使用的 Int, Double,Float,String,Array,Dictionary,Set 其实都是用结构体实现的,也是值类型。

  • Swift 中,值类型的赋值为深拷贝(Deep Copy),值语义(Value Semantics)即新对象和源对象是独立的,当改变新对象的属性,源对象不会受到影响,反之同理

15693989218770.jpg
_在 Swift 中,双等号(== & !=)可以用来比较变量存储的内容是否一致,如果要让我们的 struct 类型支持该符号,则必须遵守 Equatable 协议。_

引用类型(Reference Type)
引用类型,即所有实例共享一份数据拷贝。

  • 在 Swift 中,class 和闭包是引用类型。引用类型的赋值是浅拷贝(Shallow Copy),引用语义(Reference Semantics)即新对象和源对象的变量名不同,但其引用(指向的内存空间)是一样的,因此当使用新对象操作其内部数据时,源对象的内部数据也会受到影响。
15693990444132.jpg

在 Swift 中,三等号(=== & !==)可以用来比较引用类型的引用(即指向的内存地址)是否一致。也可以在遵守 Equatable 协议后,使用双等号(== & !=)用来比较变量的内容是否一致。

补充:
参数 与 inout
函数传参
* 当值类型的变量作为参数被传入函数时,相当于创建了新的常量并初始化为传入的变量值,该参数的作用域及生命周期仅存在于函数体内。
* 当引用类型的变量作为参数被传入函数时,相当于创建了新的常量并初始化为传入的变量引用,当函数体内操作参数指向的数据,函数体外也受到了影响。
inout
inout 是 Swift 中的关键字,可以放置于参数类型前,冒号之后。使用 inout 之后,函数体内部可以直接更改参数值,而且改变会保留。
值类型变量作为参数传入函数,外界和函数参数的内存地址一致,函数内对参数的更改得到了保留。
引用类型也可以使用 inout 参数,但意义不大。

使用注意:

  • 使用 inout 关键字的函数,在调用时需要在该参数前加上 & 符号
  • inout 参数在传入时必须为变量,不能为常量或字面量(literal)
  • inout 参数不能有默认值,不能为可变参数
  • inout 参数不等同于函数返回值,是一种使参数的作用域超出函数体的方式
  • 多个 inout 参数不能同时传入同一个变量,因为拷入拷出的顺序不定,那么最终值也不能确定

inout 参数的传递过程:

  • 当函数被调用时,参数值被拷贝
  • 在函数体内,被拷贝的参数修改
  • 函数返回时,被拷贝的参数值被赋值给原有的变量

类型的嵌套

  • 值类型嵌套值类型时,赋值时创建了新的变量,两者是独立的,嵌套的值类型变量也会创建新的变量,这两者也是独立的。


    15694001604571.jpg
  • 值类型嵌套引用类型时,赋值时创建了新的变量,两者是独立的,但嵌套的引用类型指向的是同一块内存空间,当改变值类型内部嵌套的引用类型变量值时(除了重新初始化),其他对象的该属性也会随之改变。


    15694001919102.jpg
  • 引用类型嵌套值类型时,赋值时创建了新的变量,但是新变量和源变量指向同一块内存,因此改变源变量的内部值,会影响到其他变量的值。


    15694002825169.jpg
  • 引用类型嵌套引用类型时,赋值时创建了新的变量,但是新变量和源变量指向同一块内存,内部引用类型变量也指向同一块内存地址,改变引用类型嵌套的引用类型的值,也会影响到其他变量的值。


    15694003264010.jpg

学习参考: https://www.jianshu.com/p/ba12b64f6350

你可能感兴趣的:(swift 类型 学习整理)