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

 

posted on 2016-09-20 14:39  SharpeyeKardel  阅读(1366)  评论(0编辑  收藏  举报