Swift提供了三种主集合类型,称为数组,集合和字典,用于存储值的集合。 数组是值的有序集合。 集合是唯一值的无序集合。 字典是键 - 值关联的无序集合。
可变集合
如果创建数组,集合或字典,并将其分配给变量,则创建的集合将是可变的。 这意味着您可以通过在集合中添加,删除或更改项目来更改(或变更)集合。 如果将数组,集合或字典分配给常量,那么该集合是不可变的,并且其大小和内容不能更改。
注意:在不需要更改集合的所有情况下创建不可变集合是一个好习惯。 这样做使您更容易理解您的代码,并使Swift编译器优化您创建的集合的性能。
数组
数组在有序列表中存储相同类型的值。 相同的值可以在不同位置多次出现在数组中。
数组类型速写语法
创建一个空数组
您可以使用初始化语法创建特定类型的空数组:
var someInts = [Int]()
print("someInts is of type [Int] with \(someInts.count) items.")
// Prints "someInts is of type [Int] with 0 items."
请注意,someInts变量的类型从初始化程序的类型推断为[Int]。
或者,如果上下文已经提供类型信息,如函数参数或已经输入的变量或常量,则可以使用空数组文本创建一个空数组,该数组以[](一对空方括号)表示:
someInts.append(3)
// someInts now contains 1 value of type Int
someInts = []
// someInts is now an empty array, but is still of type [Int]
使用默认值创建数组
Swift的数组类型还提供了一个初始化器,用于创建一个特定大小的数组,其所有值设置为相同的默认值。 你传递这个初始化器一个适当类型的默认值(称为repeating):以及该值在新数组中重复的次数(称为count):
var threeDoubles = Array(repeating: 0.0, count: 3)
// threeDoubles is of type [Double], and equals [0.0, 0.0, 0.0]
通过两个数组相加来创建数组
您可以通过将具有兼容类型的两个现有数组与加法运算符(+)相加来创建新数组。 新数组的类型从添加在一起的两个数组的类型推断:(注意:两个数组中的元素类型必须一致)
var threeDoubles = Array(repeating: 3.1, count: 3)
// threeDoubles is of type [Double], and equals [0.0, 0.0, 0.0]
var anotherThreeDoubles = Array(repeating: 2.5, count: 3)
// anotherThreeDoubles is of type [Double], and equals [2.5, 2.5, 2.5]
var sixDoubles = threeDoubles + anotherThreeDoubles
// sixDoubles is inferred as [Double], and equals [0.0, 0.0, 0.0, 2.5, 2.5, 2.5]
您还可以使用数组字面量初始化数组,这是将一个或多个值写入数组集合的简写方法。 数组文本被写为值列表,用逗号分隔,并用一对方括号括起来:
下面的示例创建一个名为shopping List的数组来存储字符串值:
var shoppingList: [String] = ["Eggs", "Milk"]
// shoppingList has been initialized with two initial items
shoppingList变量被声明为“一个字符串值数组”,写为[String]。 因为此特定数组已指定值类型为String,所以仅允许存储String值。 这里,shoppingList数组用两个字符串值(“Eggs”和“Milk”)初始化,并写在数组文本中。
字面量的初始化方法
var shoppingList = ["Eggs", "Milk"]
因为数组文本中的所有值都是相同的类型,Swift可以推断[String]是用于shoppingList变量的正确类型。
访问和修改数组
您可以通过其方法和属性或通过使用下标语法来访问和修改数组。
要找出数组中的元素个数,请使用其只读计数属性:
print("The shopping list contains \(shoppingList.count) items.")
// Prints "The shopping list contains 2 items."
使用布尔isEmpty属性作为检查count属性是否等于0的快捷方式:
if shoppingList.isEmpty {
print("The shopping list is empty.")
} else {
print("The shopping list is not empty.")
}
// Prints "The shopping list is not empty."
您可以通过调用数组的append(_ :)方法将新项添加到数组的末尾:
shoppingList.append("Flour")
// shoppingList now contains 3 items, and someone is making pancakes
或者,使用附加赋值运算符(+ =)附加一个或多个兼容项目的数组:("注意:"只能在确定类型的数组中拼接相同类型的数组,如果数组是Any类型的,则可以随便拼接)
shoppingList += ["Baking Powder"]
// shoppingList now contains 4 items
shoppingList += ["Chocolate Spread", "Cheese", "Butter"]
// shoppingList now contains 7 items
通过使用下标语法从数组中检索值,在数组名称后面的方括号中传递要检索的值的索引:
var firstItem = shoppingList[0]
// firstItem is equal to "Eggs"
您可以使用下标语法来更改给定索引处的现有值:
shoppingList[0] = "Six eggs"
// the first item in the list is now equal to "Six eggs" rather than "Eggs"
您也可以使用下标语法同时更改值的范围,即使替换值集的长度与要替换的范围不同。 以下示例将“Chocolate Spread”,“Cheese”和“Butter”替换为“Bananas”和“Apples”:
shoppingList[4...6] = ["Bananas", "Apples"]
// shoppingList now contains 6 items
在数组中插入元素
注意:您不能使用下标语法将新项附加到数组的末尾。
要在指定索引处将数据插入数组,请调用数组insert(_:at :)方法:
shoppingList.insert("Maple Syrup", at: 0)
// shoppingList now contains 7 items
// "Maple Syrup" is now the first item in the list
同样,使用remove(at :)方法从数组中删除一个项目。 此方法将删除指定索引处的项目,并返回已移除的项目(虽然如果不需要,您可以忽略返回的值):
let mapleSyrup = shoppingList.remove(at: 0)
// the item that was at index 0 has just been removed
// shoppingList now contains 6 items, and no Maple Syrup
// the mapleSyrup constant is now equal to the removed "Maple Syrup" string
注意:如果尝试访问或修改超出数组现有边界的索引的值,则会触发运行时错误。 您可以通过将索引与数组的count属性进行比较来检查索引是否有效。 除非计数为0(意味着数组为空),数组中最大的有效索引将始终为count - 1,因为数组从零开始索引。
在删除元素时,数组中的任何间隙都将关闭,因此索引0处的值再次等于 "Six eggs":
firstItem = shoppingList[0]
// firstItem is now equal to "Six eggs"
如果要从数组中删除最后一个项目,请使用removeLast()方法,而不是remove(at :)方法,以避免查询数组的count属性。 像remove(at :)方法,removeLast()返回删除的项:
let apples = shoppingList.removeLast()
// the last item in the array has just been removed
// shoppingList now contains 5 items, and no apples
// the apples constant is now equal to the removed "Apples" string
遍历数组
您可以使用for-in循环遍历数组中的整组值:
for item in shoppingList {
print(item)
}
// Six eggs
// Milk
// Flour
// Baking Powder
// Bananas
如果您需要每个项目的整数索引及其值,请使用enumerated()方法对数组进行迭代。 对于数组中的每个项,enumerated()方法返回一个由整数和项组成的元组。 整数从零开始,每个项目向上计数一次; 如果枚举整个数组,这些整数匹配项目的索引。 您可以将元组分解为临时常量或变量作为迭代的一部分:
for (index, value) in shoppingList.enumerated() {
print("Item \(index + 1): \(value)")
}
// Item 1: Six eggs
// Item 2: Milk
// Item 3: Flour
// Item 4: Baking Powder
// Item 5: Bananas