数组、字典、集合(Three Primary Collectio
写在前头
- 这章的题目叫Collection Type,我也不知道咋翻译,而且貌似Collection Type不止这三个,只是swift默认提供了这三种,至于有没有其它或者是自己定义的,也只能等以后来发现了,先暂时记在这里。
- swift里的array,set,dictionary都是通过Generic Collections(泛集合?泛类型我也看了的,稍后会再写一篇泛类型的,但那个里面貌似也没讲很多这方面的)来实现的,这个暂时还不知道去哪可以考究到。
- 能定义为常量最好定义为常量,因为定义成常量(Constant)swift会对其进行优化,而定义成变量则不会。
- 字典(Dictionary)、集合(Sets)的文档我还没看,先放着,看完了再写吧。
数组(Array)
创建数组的几种方法
var someInt = [Int]()
-
var threeDoubles = [Double](count: 3, repeatedValue: 0.0)
创建装有三个重复的元素(0.0)的数组 -
var aNewArray = anArray + anotherArray
通过两个同类数组相加获得一个新的数组 -
var anArray: [String] = ["Egg","milk","cat"]
这里的[String]
其实可以省略,swift有智能推测功能,可以直接根据你传入的元素类型,推测出这是个什么类型的数组
注意:这里绝对不要使用这种方法
var anArray = []
,这个[]顶多也就是下面置空数组的时候用一下就好,我自己在xcode上实验过,如果你这么写,虽然不会报错,而且这样的确生成了一个新的数组,但这个anArray的类型并不是Array,而是NSArray,这个类是OC里的数组类型,两者不兼容,这我也实验过,比如用这个NSArray类型的数组去加上一个Array类型的数组,系统直接报错,而且也没有了swift那些增删改的方法,如果你要对它进行增删改需要使用OC的语法,所以,还是不要这样使用,毕竟我们已经开始使用swift了不是吗。
数组的增删改查
-
增
-
.append(_:)
在数组的末尾增加一个元素 -
insert(_:atIndex:)
在特定的index位置插入一个元素,注意这个index不能超出数组所拥有的index值(也就是不能大于等于array.count-1) -
+=
给数组末尾插入若干个元素,这里实际上是运用上面创建数组的方式,两个数组相加得到一个新的数组
-
-
删
-
removeAtIndex(_:)
在特定index位置删掉一个元素,并返回这个被删掉的元素 -
removeLast()
删掉数组最后一个元素,并返回这个被删掉的元素 -
anArray = []
注意这是在anArray之前已经被定义过才可以这样做,这样做是直接把数组里的内容都删光,但这个数组的类型还是与之前的类型保持一致,也就是说,之前里面放的是Int,现在依旧如此
-
-
改
-
anArray[0] = "Six eggs"
把index编号为0的元素替换成一个新的字符串“Six eggs” -
anArray[4...6] = ["Bananas","Apples"]
把一片连续的数组元素进行集体替换赋值 - 注意这里index不能超出数组所拥有的index值(也就是不能大于等于array.count-1)
-
-
查
-
var firstItem = anArray[0]
获取指定index下标位置的数组元素 -
.count
获取数组元素的数量 -
.isEmpty
检查数组中是否有元素,返回一个Bool值告诉你检查结果
-
数组的遍历(Iterating Over an Array)
注意:for-in循环是一种快速的遍历方法,但它却是一个可读不可写的循环,也就是说在for-in循环里,是没有办法对数组元素进行修改的。
for item in anArray {}
-
for (index, value) in anArray.enumerate() {}
把元组(truple)和.enumerate()
结合起来取出数组的元素和对应的下标同时取出来
另:用for-in对数组进行遍历的时候有一个特殊情况,如果某array以
anArray[2..<array.count]
这种范围的形式在for-in声明里使用的话,是会被swift重新视为一个新的数组。而在for-in以外的其它地方,则不是,而是生成一个新的类型ArraySlice(数组片段)。看下面代码:
看代码:
-
在for-in中
for (index, element) in array[2..<array.count].enumerate() { //此处代码省略 }
此处,元组(index, element)取出来的index并不是从2开始的,而是从0开始的,
array[2..<array.count].enumerate()
在这里被视为是一个新的数组 -
其它情况下
var array1 = [4,2,9,8,5,6] var array2 = array1[2...5]
此处的array2并不会像上面for-in里一样被视为一个下标从0到3的新数组,而是产生了一个新的类型ArraySlice(数组片段)它的下标依然是2到5,实际上也就是array1的一个片段而已,它依然可以做+法运算,增删改等操作,但是它已经完全是另外一种东西了,它的任何行为都要遵循ArraySlice的定义,至于ArraSlice到底可以怎么用,可以去查帮助文档,我也就是瞄了一下,反现在暂时也用不到,用到的时候再看也不迟。