Swift中类和结构体的学习笔记01
2017-01-03 本文已影响11人
流星大石头
-
类和结构体的不同点
(1) 结构体(和枚举)是值类型,而类是引用类型。在设计结构体时,我们可以要求编译器保证不可变性。而对于类来说,我们就得自己来确保这件事
(2)内存的管理方式有所不同。结构体可以被直接持有及访问,但是类的实例只能通过引用来间接地访问。结构体不会被引用,但是会被复制。也就是说,结构体的持有者是唯一的,但是类却能有很多个持有者。
(3)使用类,我们可以通过继承来共享代码。而结构体(以及枚举)是不能被继承的。想要在不同的结构体或者枚举之间共享代码,我们需要使用不同的技术,比如像是组合、泛型以及协议扩展等。 -
Swift中,结构体是用来构建值类型的。结构体不能通过引用来进行比较,你只能通过它们的属性来比较两个结构体。改变一个结构体变量的属性,在概念上来说,和为整个变量赋值一个全新的结构体时等价的。我们总是使用一个新的结构体,并设置被被改变的属性值,然后用它替代原来的结构体。但是编译器依然会原地进行变更。因为数组是结构体,如果我们定义了一个包含其他值类型的数组,我们可以更改数组中某个元素的属性,整个数组的didSet方法也将会被触发。如果存储的是引用类型的话,就不会触发数组的didSet方法了。
因为结构体只有一个持有者,所以它不可能造成引用循环。对于类和函数这样的引用类型,我们需要特别小心,避免造成引用循环的问题。 -
我们可以为结构体定义一个自定义的初始化方法,我们可以将它直接添加到结构体的定义中去。不过,对于包含自定义初始化方法的结构体,Swift就不再为它生成基于成员的初始化方法了。如果在拓展中定义一个初始化方法,结构体默认的初始化方法会被保留。