swift底层探索 04-利用sil解读关键字mutating,inout

swift底层探索 03 - 值类型、引用类型中知道值类型在内存中直接保存具体的值,所以说值类型内部的值只能覆盖并不能修改

下面看2种情况

  • 引用类型即使被修饰为let,依旧可以修改age。因为:不可变的是a本身的地址指针,而a.age是被var修饰可以修改的
  • 值类型中就行不通了,因为age也保存在a的内存布局中,而a的整块内存布局是不允许修改的。需要用var修饰才可以修改整块内存布局。这一点值类型就比较特殊。

1. mutating

  • 这种情况下想要修改一下self内部的值,就难办了。因为引用类型可以修改self中的其他变量,而值类型不可以。而这种需求是一定存在的。

解决---根据编译器提示

  • 在方法前加一个mutating,可是这样做编译器到底做了什么?还是使用sil来查看。sil如何获取和使用

sil文件

  • 本质就是在方法第一个默认参数self前加上了inout,使self的修饰符从let变为var可修改,从而达到修改的目的.

【总结】

  1. 因为方法的一个参数self是默认编译器自带的,我们是没法进行修饰的.利用mutating + func a()语句使编译器将第一个默认参数self改为var
  2. mutating修饰方法,而inout 修饰参数

2. inout

我们都知道方法的参数默认都是let不可变的,有时需要在方法体内对传入参数做修改.
比如像这样,编译器一定会报错的:

解决---模仿mutating的处理

  • 解决方法就是在参数类型前加上inout,并且实现了不可变-值类型的交换。

sil文件

  • 有了mutating的过渡这部分就很好理解了吧~

【总结】

  1. inout相当于取地址,可以理解为地址传递,即引用
  2. mutating修饰方法,而inout 修饰参数
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容