在大多数语言中数组是常见的一个基本类型数据结构,Swift也不例外,和大多数语言一样,Swift中数组是同类型对象的有序集合。然而在Objective-C的NSArray
不一样的是可以存储任意类型的对象,Swift强制要求数组的元素为同一类型,这样可以操作数组元素时不需要再去检查数据类型。
数组方法简介
下面的表格列出了数组的主要函数及操作,接下来我们将更深入的了解它们。 当然数组还有些其他方法,这里仅列出常用的.我不确定我会不会经常用数组的reverse
反转元素方法,但是我很惊喜它的存在。
创建数组
和其他类型一样,主要有2种方式创建数组,分别为采用字面赋值构造数组或调用初始化方法。下面例子列出怎么创建数组:
var literalArray = [0,1,1,2,3,5,8,13,21]
var emptyArray = [Int]()
var defaultValueArray = [Int](count: 5, repeatedValue: 0)
第三行也是通过构造函数初始化创建,只不过创建了一个包含5个都为0的元素数组。
[Int]
形式创建数组实际上是Array<T>
的简单写法,Array<T>
这种方式并没有在上面表格中列出,由于[Int]
易读性强,Apple鼓励使用这种简单方式创建数组。
有一点值得注意的是,通过var
定义的数组是可以修改的(mutable
),可以增加、删除元素。而通过let
定义的常量数组,只能读取不能修改它。
访问数组值
在swift中有好几种方式访问数组的值,但是,最常见的还是通过下标方式subscript
:
var fourthValueOfArray = literalArray[3]
上面表示读取数组的第4个值,在C或者其他大多数语言中,索引都是从0开始计数,这就是为什么索引值为3读取的确实第4个值。下面给出表格说明:
在swift中也有其他读取元素的方法,在大多数语言中访问数组的第一个和最后一个值,你需要手动的去设置数组的下标,如:访问第一个[0]
,访问最后一个[literalArray.count-1]
。很明显,这种方式看起来不直观简洁。在swift中apple在数组中增加了first
和last
属性:
var firstValue = literalArray.first //Returns Optional Int containing 0
var lastValue = literalArray.last //Returns Optional Int containing 21
通过first和last访问素组的值将返回可选类型的值optional values
,当数组为空时,则返回nil
.即是只有一个元素时,通过first
和last
访问还是返回optional
值。
另外一种方式访问素组就是通过循环方式,可以采用loop
方式或者for-in
循环。
var sum = 0
for number in literalArray
{
sum += number
}
这段代码实现的是遍历数组,并将素组的每个元素相加统计他们的和。
当我学会C#的foreach
循环时(相当于swift的 for-in
),我开始大量的使用它,但是有时候会遇到问题,有时候需要用到索引index
,而在swift中有个很好的处理方式,可以通过enumerate
枚举元素,并且返回一个由index
和元素组成的元组Tuples
。
for (index, number) in enumerate(literalArray)
{
println("Fibonacci Number \(index): \(number)")
}
//Last Line Output: "Fibonacci Number 8: 21"
数组的元素数量
在swift中有2个方法可以检查元素的数量。最简单的方式就是.count
:
var elementsInArray = literalArray.count //returns 9
另外还有你可以通过isEmpty
来检查数组是否有元素,即是否为空数组。
var emptyStatus = literalArray.isEmpty //returns false
IsEmpty
返回boolean
类型判断数组是否为空,即如果数量为0则为true
,否则为false
.
修改数组
var
定义的数组才能修改,有几种方式可以修改数组。
增加数组元素
在数组末尾增加元素或者插入元素到指定的index
,下面介绍通过append
和+=
方法增加元素
emptyArray.append(5)
emptyArray += [5]
上面2个表达式效果是相同的。值得注意的一点是,使用+=
操作符时,右边的必须为数组,即使只有一个元素时也要为数组,还有就是通过这种方式你可以一次性给数组增加多个值,如:
emptyArray += [9, 8, 7, 6]
现在,emptyArray
含有了[5,5,9,8,7,6]这些元素值。
可以通过insert
方法插入元素到数组的任意位置。
emptyArray.insert(12, atIndex: 2)
//emptyArray now is [5, 5, 12, 9, 8, 7, 6]
我们在第三个位置插入12。
清空数组方法:
emptyArray.removeAll()
//emptyArray now is empty once more
removeAll
方法接受一个参数,允许清空数组时是否保持数组的容量,该参数默认值为false
,即将数组的capacity
容量设置为0。如果你想保持容量,可以参考下代码:
let originalCapacity = emptyArray.capacity //originalCapacity = 12
emptyArray.removeAll(keepCapacity: true)
let newCapacity = emptyArray.capacity //newCapacity = 12
由上代码可以看出emptyArray在需要重新分配内存之前可以存储12个值,然而使用removeAll()
,newCapcity
则等于0。
基于数组创建新数组
可以采用+
合并2个数组为一个数组,它返回的新数组顺序按照操作符左边的数组到右边数组的元素一次排列。
var arrayOne = [1,2,3,4,5]
var arrayTwo = [30, 40, 50]
var bothArrays = arrayOne + arrayTwo
//bothArrays now is 1, 2, 3, 4, 5, 30, 40, 50]
调用reserse
方法反转数组元素也会返回一个新的数组。
var normalArray = [20, 21, 22, 23, 24, 25]
var reversedArray = normalArray.reverse()
//reversedArray now is [25, 24, 23, 22, 21, 20]
文章中所有代码在Xcode6 Beta6中测试通过。