Swift结构体(Struct)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift结构体(Struct)相关的知识,希望对你有一定的参考价值。
参考技术A age给定默认值age不给定默认值
结论:
相对于class来说,struct会自动给定初始化方法,如果是class的情况下,会报错
在SIL角度来剖析一下原理:
打开项目文件夹目录
把 mian.swift编译成main.sil并打开(推荐使用vs code)
来看main.sil,提供了两个初始化方法
如果我自己实现了init方法
如果是这样的话,当前编译器就不会帮我生成init方法了,再次查看main.sil
这个时候这里面就只有我们自己生成的初始化方法了
先了解什么是值类型:
例子:
在栈区创建的内存空间是由系统管理的
通过lldb调试来查看age的地址,这个地址很明显是个栈上的地址空间(高地址)
然后对这个内存进行格式化输出,在这个内存地址里面直接存储的我们的值18(0x0000000000000012 )
当放开设置的断点①,停留在断点②处的时候,将age赋值给了age2,等同于我直接把age里面的值18拿出来赋值给了age2,也就是说将18赋值给了age2
同样适用lldb调试看结果:
可以看出,age与age2这两个地址只差了8字节大小,栈空间地址分配的过程中是从高到低的,这也可以认证age是存储在栈上的
然后我在格式过输出age与age2的值:
这个值也是一样的,在修改的过程中,修改的是当前独立地址里面的内存的值,也就意味着,在这个过程中,可以说age变量是一个值类型
同样的,看struct的例子:
通过lldb调试查看:
可以看出,这个结构体的地址0x00000001000081a0中,直接存储的就是0x0000000000000012、0x0000000000000014,所以认证了结构体是值类型
注意点:尽量避免在值类型中包含引用类型
以上是关于Swift结构体(Struct)的主要内容,如果未能解决你的问题,请参考以下文章