Objective-C编写了2个不同的类来区分不可变数组(NSArray)和可变数组(NSMutableArray):
Swift通过使用常量和变量来区分不可变数组和可变数组。
只要将数组定义为常量,它就是不可变数组,如:
let constantArray = ["a", "b", "c", "d"]
将数组定义为变量,它就是可变数组,如:
var mutableArray = ["e", "f", "g", "h", "i"]
Swift的不可变数组和可变数组的性质与Objective-C几乎是一样的,可见笔者另文:《NSArray和NSMutableArray的copy和MutableCopy》
因此,不可变数组虽然无法改变数组本身(也就是不能在数组层面上进行修改,如设法改变数组大小、以及使用append,remove等方法),但是可以改变数组内的元素:
class classA { //自定义类classA var aString: String //classA的实例变量aString init(str: String) { //构造函数 aString = str } } var b: classA = classA(str:"b"); //创建3个classA类型的变量b,c,d var c: classA = classA(str:"c"); var d: classA = classA(str:"d"); let classAs = [b, c, d] //将b,c,d作为元素定义在一个不可变数组中 var f = classAs[1] //定义一个f变量,并赋其值为classA类型的变量c print(classAs[1].aString) //输出c的实例变量的值 f.aString = "eeee" //改变f的实例变量的值 print(classAs[1].aString) //再次输出c的实例变量的值
运行结果:
c eeee
这里可以再做一个验证Swift字符串String类型是值类型的实验:
let intArray = [1, 7, 100, 101, -9, 0] var myInt = intArray[4] print(intArray[4]) myInt = 10000000 print(intArray[4]) //Int无疑是值类型,其值不会被改变 let stringArray = ["str1", "str2", "str3", "str4"] //定义一个字符串的不可变数组 var myStr = stringArray[2] //定义一个myStr变量,并赋值为"str3" print(stringArray[2]) //输出str3 myStr = "anotherString" //修改myStr print(stringArray[2]) //再次输出str3
运行结果:
-9 -9 str3 str3