Collection Types
Swfit 提供了三种主要的类型集合,众所周知的 arrays, sets 和 dictionaries 用于存储类型数据。 Arrays 是一个有序的类型值。 Sets 是一个无序且唯一的类型值。 Dictionaries 是一个无序的键值对类型值。
Arrays, sets 和 dictionaries 在 Swift 里总是明确的类型对于值和键被存储。也就是意味着如果插入一个错误的值类型在一个集合中会抛出错误,也意味着你从一个集合里面取出的值的类型是确定的。
集合可变性
- 如果你创建一个 Array, Set, Dictionary 并且分配给一个变量,这个被创建集合是可变的。这也就意味着它是可变的,这个集合被创建后可以进行添加,删除和改变操作。如果你分配一个Array,Set,Dictionary 给一个常量,那么这个集合是不可变的,并且它的大小和内容都是不可变的。
Arrays
- 一个数组存储相同类型的值在一个有序的列表。相同的值可以多次出现在一个数组的不同位置。
Array Type 简短的语法
- 一个 Swift array 写法完整的是
Array<Element>
,这里的Element
是一个数组允许存储的值的类型。你也可以写这个类型的简短形式类似[Element]
.尽管这两种形式在功能上是一直的,这个简洁的形式是优先选择的。
创建一个空的 Array
- 你可以创建一个确定类型的空 Array。
|
|
注意这个
someInts
变量的类型被隐式转换为[Int]
从一个初始化的类型.或者,如果它的上下文已经被提供了类型信息,例如一个函数参数或者一个已经有类型的变量或常量,你可以创建一个空的数组和一个字面空数组,写法是
[]
.
|
|
创建一个默认值的 Array
- Swift 的
Array
类型也提供了一个初始化器创建一个确定大小的数组或者设置相同的值对所有的值。你通过初始化器多个条目添加到一个新 Array(称之为count
)和提供合适的类型作为默认值(称之为repeatedValue
)。
|
|
创建一个数组通过合并两个数组
- 你可以创建一个新数组添加两个已经存在的数组并且伴随一致的类型使用这个加法操作符(
+
)。这个新数组的类型会被推导从你共同添加的两个数组。
|
|
从一个数组字面量创建 Array
- 你可以从数组字面量来初始化一个数组,这种简洁的方式,可以用来写一个或多个值作为一个数组集合。一个数组字面量写法像一个列表,用逗号分隔,使用中括号包围。
[value1, value2, value3]
|
|
- 这个
shoppingList
变量被声明成 “一个字符串数组”,写法是[String
]。因为这个特别的数组已经指定了一个值类型为String
, 它只允许存储String
类型的值。
访问和修改数组
你可以通过它自有的方法和属性,或通过下标语法来访问和修改数组。
为了找出一个数组的项目数量,检查这个只读的属性
count
:12print("The shopping list contains \(shoppingList.count) items.")// Prints "The shopping list contains 2 items."使用这个
Boolean
类型的属性isEmpty
,是用来检测这个数组的count
属性是否等于0:123456if shoppingList.isEmpty {print("The shopping list is empty.")} else {print("The shopping list is not empty.")}// Prints "The shopping list is not empty."你可以通过数组的
append(_:)
方法来添加一个新项到数组中:12shoppingList.append("Flour")// shoppingList now contains 3 items.或者,添加一个或多个一致的项目可以使用加法操作符(
+=
):1234shoppingList += ["Baking Powder"]// shoppingList now contains 4 itemsshoppingList += ["Chocolate Spread", "Cheese", "Butter"]// shoppingList now contains 7 items使用数组的下标语法来取得一个值,通过索引值可以取得任何你想要的,在一个数组名字后面的中括号里使用。
|
|
你可以使用小标语法去更改一个已经存在的值。
1shoppingList[0] = "Six eggs"你也可以使用下标语法一次性去修改一个范围的值,甚至去替换不同长度的数组
|
|
- 插入一个项目到数组指定的位置,调用数组方法(
insert(_:atIndex:)
):
|
|
相似的,删除一个数组指定位置的项目,使用数组方法(
removeAtIndex(_:)
),这个方法会返回被移除的项目:1234let mapleSyrup = shoppingList.removeAtIndex(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如果你想移除数组的最后一个元素,使用方法(
removeLast
)而不是使用removeAtIndex
方法,为了避免需要查询数组的count
属性:1234let apples = shoppingList.removeLast()// the last item in the arry has just been removed// shoppingList now contains 5 items, and no apples// the apples constant is now equal to teh removed "Apples" string
迭代数组
使用
for-in
循环来迭代一个数组的实体值。123for item in shoppingList {print(item)}如果你需要一个下标,你可以使用
enumerate()
方法来迭代这个数组。对于数组的每个元素,enumerate()
方法返回一个元组。123for (index, value) in shoppingList.enumerate() {print("Item \(index + 1): \(value)")}
Sets
- 一个
set
存储相同的类型和不同的值在一个无序的集合中。你可以使用一个set
来替代一个数组当元素的顺序不是很重要时,或者你需要确保一个元素只会出现一次。
Set 类型的Hash值
在一个
set
中必须存储可被hash话的值。这个类型必须提供一种可以计算它的hash值,一个hash值是一个Int
类型,如果hash值相同的对象,那么他们是相等的。例如: a == b 相当于 a.hasValue == b.hashValue所有的Swift基本类型(例如:
String
,Int
,Double
和Bool
)默认都是可被hash的,并且他们可以作为set
的值类型或者dictionary
的键类型。
Set 类型语法
- 这个类型在swift中的写法是
Set<Element>
, 这里的Element
是一种可已允许被存储的类型,不像数组,set
没有简便的形式。
创建和初始化一个空 Set
你可以使用初始化语法来创建一个空的并且类型明确的
set
:123var letters = Set<Character>()print("letters is of type Set<Character> with \(letters.count) items.")// prints "letters is of type Set<Character> with 0 items."或者,如果它的上下文中已经提供了类型信息,例如一个函数的参数,或者已经声明了的变量和常量,你可以创建一个空的
set
和一个空数组字面量:1234letters.insert("a")// letters now contains 1 value of type Characterletters = []// ltters is now an empty set, but is still of type Set<Character>
用数组字面量来创建Set
- 你可以使用数组字面量来初始化一个
set
,提供一个或多个值到set
集合的简介方式.
|
|
访问和修改Set
集合
- 你可以通过
set
的方法和属性来访问和修改集合。找出一个集合的所有元素,可以使用count
属性。
|
|
- 使用
Boolean
类型属性isEmpty
,这是一个检测count
属性是否等于0的简便写法。
|
|
- 你可以使用
insert(_:)
方法来插入一个新元素到set
|
|
- 你可以使用
remove(_:)
方法来移除一个元素,该方法会返回你移除的元素,如果返回的元素为nil,那么这个set不包含这个元素。或者,你可以使用removeAll()
来移除所有的元素。
|
|
- 你可以使用
contains(_:)
方法来检测set
中是否包含元素.
|
|
迭代set
集合
- 你可以使用
for-in
循环来迭代set
集合.
|
|