原文出自:标哥的技术博客
前言
Swift语言提供Array、Set和Dictionary三种基本的集合类型用来存储集合数据。数组是有序的数据集;集合是无序无重复的数据集;而字典是无序的键值对数组集。
Swift的Array、Set和Dictionary类型被实现为泛型集合。因此,它所存储的元素的类型必须是一致的,同样,我们取出来的数据类型也是明确的。
集合的可变性(Mutability Of Collections)
如果创建一个Arrays、Sets或Dictionaries并且把它分配成一个变量,这个集合将会是可变的。这意味着我们可以在创建之后添加更多或移除已存在的数据项,或者改变集合中的数据项。
如果我们把Arrays、Sets或Dictionaries分配成常量,那么它就是不可变的,它的大小和内容都不能被改变。
若我们确定集合不需要改变,那么我们应该使用不可变集合,也就是使用let
声明,那样编译器会为我们优化。
// 在swift中要让Array、Set、Dictionary类型的变量是可变的,用var声明就可以了。
// 如果不希望可变,用let声明即可。
let immutableArrray = [Int]()
// 提示:error: immutable value of type '[Int]' only has mutating
// members named 'append'
//immutableArrray.append(12)
// OK
var mutableArray = [Int]()
mutableArray.append(12)
数组(Arrays)
数组使用有序列表存储同一类型的多个值,相同的值可以多次出现在一个数组的不同位置中。我们需要明确,数组是有序的,元素类型是相同的。
Swift中的Array与Foundation中的NSArray是桥接的,可以相互转换。
创建一个空数组(Create An Empty Array)
由于Swift中的数组是泛型,因此必须指定元素的数据类型:
// 使用构造语法来创建一个由特定数据类型构成的空数组:
// 方括号中必须指定类型,因为Array是一种泛型
var emptyArray = [Int]()
// 也可以使用结构体Array的构造写法
var anotherEmptyArray = Array<Int>()
// 如果之前类型明确了,直接再用[]即可.一样是Int类型的元素,是可推断出来的
emptyArray = []
创建带默认值的数组(Creating An Array With A Default Value)
Swift提供了如下方法,可以创建带有默认值的数组,这个构造方法是使用count个指定元素来初始化:
/// Construct a Array of `count` elements, each initialized to
/// `repeatedValue`.
public init(count: Int, repeatedValue: Element)
例如:
var threeDoubles = [Double](count: 3, repeatedValue:0.0)
// threeDoubles 是一种 [Double] 数组,等价于 [0.0, 0.0, 0.0]
数组相加来创建数组(Creating An Array By Adding Two Array Togeter)
两个数组能够通过加号+
来创建一个合并的数组,是因为苹果为我们提供了这样的方法:
public func +<RRC1 : RangeReplaceableCollectionType, RRC2 : RangeReplaceableCollectionType where RRC1.Generator.Element == RRC2.Generator.Element>(lhs: RRC1, rhs: RRC2) -> RRC1
这是个泛型函数,要求类型RRC1和RRC2是遵守RangeReplaceableCollectionType
协议的,并且这两个集合的元素类型要求相同。而数组是遵守RangeReplaceableCollectionType
协议的,因此可以通过此方法将两个数组相加。
例如:
// anotherThreeDoubles 被推断为 [Double],等价于 [2.5, 2.5, 2.5]
var anotherThreeDoubles = Array(count: 3, repeatedValue: 2.5)
// sixDoubles 被推断为 [Double],等价于 [0.0, 0.0, 0.0, 2.5, 2.5, 2.5]
var sixDoubles = threeDoubles + anotherThreeDoubles
用数组字面量构造数组(Creating An Array With An Array Literal)
我们可以使用字面量数组来进行数组构造,这是一种用一个或者多个数值构造数组的简单方法。字面量是一系列由逗号分割并由方括号包含的数值:
// shoppingList 已经被构造并且拥有两个初始项。
var shoppingList: [String] = ["Eggs", "Milk"]
由于类型是明确的,因此我们可以交由编译器来推断类型数组的类型:
var shoppingList = ["Eggs", "Milk"]
访问和修改数组(Accessing And Modifying An Array)
常见的数组访问和修改操作有:
- 获取数组元素个数
- 判断数组是否为空
- 数组追加元素
- 数组在某个位置插入元素
- 数组在某个范围插入元素
数组元素个数
获取数组元素的个数,可通过count
属性获取:
// 打印结果:"The shopping list contains 2 items."
print("The shopping list contains \(shoppingList.count) items.")
数组判断是否为空
判断数组是否为空,可以通过isEmpty
属性判断,也可以通过count
判断:
if shoppingList.isEmpty {
print("The shopping list is empty.")
} else {
print("The shopping list is not empty.")
}
// 或者通过count属性
if shoppingList.count == 0 {
print("The shopping list is empty.")
} else {
print("The shopping list is not empty.")
}
数组末尾追加元素
常用的有以下几种方法:
- 通过
append()
追加 - 通过
appendContentsOf()
追加 - 通过
+=
追加
我们先来分析一下数组结构体所提供的方法:
/// Append the elements of `newElements` to `self`.
///