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)的主要内容,如果未能解决你的问题,请参考以下文章

Swift 结构体的使用

Swift2.0结构体类型&枚举类型

Swift中 Class和Struct的区别

Swift-Class和Struct的区别(结构体和类的区别)

Swift 的 结构体

Swift Struct 的引用计数