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(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)(Swift)中常量structs是一点一滴不行改变的,这是arrays以及dictionaries之所以是structs而不是classes的来由之一。