inout

inout处理普通变量

inout_第1张图片

最后的结果是10,inout的目的就是能在函数内去修改形参,然后影响实参,或者说修改函数内的参数,影响外面的参数

inout_第2张图片

看汇编代码把5赋值到一个地址就是num的地址,然后把地址给rdi(rdi一般是用来传参),然后调用函数

inout_第3张图片

不详细解释了大约就是把rdi之前传的地址和值分开,然后把值+5放回原来的地址,然后再把地址值取出来,放入rax,返回到main,所以对于普通的变量就是传递地址

inout处理属性

inout_第4张图片

实际验证了一下,inout确实能修改属性,看下汇编指令

inout_第5张图片

先看函数,除了rsp rbp等栈操作,就一段汇编代码看,就是把10赋值给了rdi存储的地址值

inout_第6张图片

然后返回main,把rdi敲出来,就是dir的地址,也没毛病,因为结构体的第一个值就是存储着第一个属性

inout_第7张图片

函数是没啥变化,就看外部对于rdi做了什么操作

inout_第8张图片

可以看到对于计算属性来说,会用get获取到值,然后调用yAdd,调用完之后再调用setter方法,可以理解成这样的代码

let a = dir.y_offset

yAdd(&dir.y_offset)

let 临时变量 = y_os

dir.y_offset = 临时变量

这里只针对计算属性,其它属性和变量不是这样的

你可能感兴趣的:(Swift)