apple文档中指出,每个数组都是保留一定量的内存来保存其内容,也就是数组长度固定,当有更多的数据插入到数组中时,当前数组会动态扩容,且存储的大小是原来的倍数,这回增加性能成本,建议如果知道存储多少元素,请在初始化时指明长度。
Array副本的修改
swift3.0后讲基本常用的类型Array、Dictinary和String等改为了结构体,也就由原本的类类型转变成了值类型。那么先看下值类型和引用类型有什么区别呢?
- 值类型:每个实例都拥有其数据的一个副本,当赋值给一个变量或者常量,或传递给一个函数的时候,都会建立一个新副本。
- 引用类型:所有实例共享一个数据副本,当被赋值给一个变量或常量或一个函数的时候,会传递这个指向实例的指针。
下图是swift值类型和引用类型:

回到问题本身
//结构体
struct structObj {
var value = 0;
}
//Class
class swiftObj{
var value = 0
}
var swiftArr = [swiftObj(),swiftObj(),swiftObj()];
var swiftArr1 = swiftArr
swiftArr[0].value = 2;
print("swiftArr:\(swiftArr)\nswiftArr1:\(swiftArr1)")
var structArr = [structObj(),structObj(),structObj()];
var structArr1 = structArr
structArr[0].value = 2;
print("structArr:\(structArr)\nstructArr1:\(structArr1)")
//打印结果
objArr:[2, 0, 0]
objArr1:[2, 0, 0]
structArr:[2, 0, 0]
structArr1:[0, 0, 0]
解释:首先Array就是一个值类型,当它赋值给一个变量的时候会建立一个新副本。
1.由于引用类型初始化之后返回的是对象的一个引用,所以swiftArr中存储的其实是里面元素对象的引用。赋值给swiftArr1时就是拷贝了元素的引用,所以swiftArr1和swiftArr里的元素指向的是同一个对象,改变一个会影响另一个。
2.而对于structArr存储的是值类型,所以在赋值给structArr1的时候拷贝的是对象的副本,互不影响。
网友评论