Structs vs classes(值类型vs引用类型)

俺们知道classes是援引类型,structs属于值类型。这虽象征,当你传递一个class,Swift传递的是目标的援,而当您传递一个struct,Swift传递的凡目标的值。

当playground写下如下代码,看看它的出口及其职能。

Structs vs classes

面分别定义了一个结构体一个近似,它们还只有生一个变量。代码分别生成一个struct和class,并保留其至相应的变量中,然后分别赋值它们至第二独变量,最后代码改变了次单变量的性。

俺们可发现,在struct示例中,只有亚单变量的foo属性改变了,然而当class示例下,两独变量的属性都转了。这便是援类型以及值类型的差。当你管classA赋值给classB,Swift使用同一的援,因此,classA与classB指于同一个实例的援。而当你以structA赋值给structB时,Swift进行了拷贝,所以现在设有个别个不同之struct。

横流:Swift有copy-on-write机制,它可趁机到只有在得的下才拷贝struct的价值。也就是说,structB=structA,不会见即刻展开拷贝,因为开始时候structA,structB值是一致之。只有你开改价值了,runtime才进行拷贝处理。

呢益描述,我们看下图:

reference

当class、structs作为一个常量,它们发出外一个微小、重要且不同之地方。

抚今追昔我们以前学的学问,我们懂得,var
和let分别定义变量和常量。当实例化为变量时,class与struct拥有一致的作为。你可以变动它的性能或者施其新值。当实例化为常量时候,class与structs有有两样。下面被咱们同探究竟。


class为常量时,你可以转移它的习性,但无可知重新赋值该常量class到任何不同之要么新的class实例中。

• struct为常量时,你非但未可知赋值,就连它们的属性你啊无克转。

下图可以演示为咱省效果(你尽好亲身实施一下,这样记忆会另行深刻)

demos

因为当Swift中常量structs是一心不可更改的,这是arrays以及dictionaries之所以是structs而未是classes的原委之一。