Swift结构和数组的冲突定义

Boo*_*oon 10 swift

在Swift编程语言中,它说:

  1. "Swift整数,浮点数,布尔值,字符串,数组和字典中的所有基本类型都是值类型,并且在幕后实现为结构."

  2. " 结构实例总是按值传递,类实例总是通过引用传递"

  3. "如果将Array实例分配给常量或变量,或者将Array实例作为参数传递给函数或方法调用,则不会在分配或调用发生时复制该数组内容.相反,两个数组共享相同的元素值序列.当你通过一个数组修改元素值时,结果可以通过另一个数组观察到."

很明显,Swift在阵列方面自相矛盾.数组是值类型还是引用类型?

Lom*_*baX 8

数组是特殊情况.它们是具有特殊行为的值类型.

在您找到第3点的页面上,有足够的信息可以理解原因:

Swift的Array类型的赋值和复制行为比其Dictionary类型更复杂.当您使用数组的内容时,Array提供类似C的性能,并且仅在需要复制时才复制数组的内容

并在您发言后立即:

相反,两个数组共享相同的元素值序列.通过一个数组修改元素值时,结果可以通过另一个数组观察到.

对于数组,只有在执行可能会修改数组长度的操作时才会进行复制.

所以,阅读这些观点我们理解:

  • 数组是结构但具有特殊行为,主要原因是保持类似C的性能.
  • 只有在复制的数组的长度发生更改时才会进行复制

最后一点:记住,复制数组时,只复制值类型(结构,枚举,基本类型).不复制对象,仅复制其引用(指针)


Sau*_*pal 0

当我尝试以下代码时,swift 中的数组是值类型:

var myArray1 = [1, 2, 3]
var myArray2 = myArray1
myArray2 += 4;
println(myArray1);
println(myArray2);
Run Code Online (Sandbox Code Playgroud)

它为 myArray1 和 myArray2 打印不同的值。如果它们共享相同的引用,则值必须相同。

  • 数组是特殊情况,对于数组,仅当长度更改时才会发生复制(就像您在示例中所做的那样)。尝试更改“myArray1[0] = 100”中的第三行并查看结果 (3认同)