avatar
童琦杰
Feb 16, 2017Technology

Swift - 集合

Array类型

Array类型以一种有序列表的形式存储相同类型的数据,同时,允许存储相同值。

以下两种写法声明了一种用于存储Element类型的Array类型。

swift
Array<Element>
[Element]

有了Array类型,你可以像自定义的类一样使用它了,例如初始化一个Array类型。

swift
var someInts = [Int]()
var threeDoubles = [Double](count: 3, repeatedValue: 0.0)

另外,Swift提供了通过字面量初始化一个Array类型。

swift
var shoppingList = ["Eggs", "Milk"]
shoppingList = [] // 重新设置空Array

访问Array元素可以使用下标语法,索引值切勿超出Array边界。

swift
var firstItem = shoppingList[0]
shoppingList[0] = "Six eggs"
shoppingList[4...6] = ["Bananas", "Apples"] // 使用新Array替代shoppingList中索引值为4,5,6的元素

添加一个新元素到Array有多种方式,可以使用append(:)、insert(:atIndex:)方法,可以使用+=操作符。

swift
shoppingList.append("Flour")
shoppingList.insert("Maple Syrup", atIndex: 0)
shoppingList += ["Chocolate Spread", "Cheese"]

使用for-in循环迭代一个Array。

swift
for item in shoppingList {
    print(item)
}

for (index, value) in shoppingList.enumerate() {
    print("Item \(index + 1): \(value)")
}

Set类型

Set类型以一种无序的方式存储相同类型的数据,并且每个存储的值是唯一的。也就是说,元素类型必须实现hashable协议,该协议提供了一个hashValue属性,用于比较元素值是否相等。

声明Set类型的语法如下。

swift
Set<Element>

有几种方法声明一个Set类型变量,使用初始化器或字面量。

swift
var letters = Set<Character>()
var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]
var favoriteGenres: Set = ["Rock", "Classical", "Hip hop"]

添加一个新元素到Set集合,可以使用insert(_:)方法。

从Set集合移除一个元素,可以使用remove(_:)方法,若成功,则返回移除的元素,否则返回nil。也可以使用removeAll()移除Set集合中所有的元素。

使用for-in循环迭代Set集合中每一个元素。

swift
for genre in favoriteGenres {
    print("\(genre)")
}

for genre in favoriteGenres.sort() { // 使用操作符<进行排序
    print("\(genre)")
}

对于Set集合还有一些基本集合操作:

  • intersect(_:)

  • exclusiveOr(_:)

  • union(_:)

  • subtract(_:)

另外,Swift还提供了几个Set集合关系方法。

  • ==,判断两个Set集合中的元素是否全部相等。

  • isSubsetOf(_:),判断当前Set集合是否是目标Set集合的子集。

  • isSupersetOf(_:),判断当前Set集合是否是目标Set集合的超集。

  • isStrictSubsetOf(_:),判断当前Set集合是否是目标Set集合的子集并且两个集合不相等。

  • isDisjointWith(_:),判断当前Set集合是否与目标Set集合互斥。

Dictionary类型

Dictionary类型以一种无序的方式存储键值对,每个键是唯一的。

有两种方式声明一个Key类型作为键,Value类型作为值的Dictionary类型。

swift
Dictionary<Key, Value>
[Key: Value]

有了Dictionary类型,你可以像自定义的类一样使用它了,例如初始化一个Dictionary类型。

swift
var namesOfIntergers = Dictionary<Int, String>()
var valueOfIntergers = [Int: String]()

另外,Swift提供了通过字面量初始化一个Dictionary类型。

swift
var airports = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
airports = [:] // 使用空Dictionary类型赋值

可以通过Dictionary类型的方法或下标形式来访问或修改Dictionary类型中的元素。

使用下标语法访问一个元素,返回值类型为Dictionary值类型的可选类型。

swift
if let airportName = airports["DUB"] {
    print("The name of the airport is \(airportName)")
} else {
    print("That airport is not in the airports dictionary.")
}

使用下标语法添加一个元素,若键值已经存在则修改对应的元素的值,否则添加新元素到Dictionary集合。

swift
airports["LHR"] = "London" // 添加
airports["LHR"] = "London Heathrow" // 修改

使用updateValue(_:forKey:)方法更新一个元素,若修改的元素已经存在则返回被修改的值,否则返回nil。该方法返回值类型为Dictionary值类型的可选类型。

swift
if let oldValue = airports.updateValue("Dublin Airport", forKey: "DUB") {
    print("The old value for DUB was \(oldValue).")
}

使用下标语法或removeValueForKey(_:)方法从Dictionary集合中移除一个元素。

swift
airports["APL"] = nil
if let removedValue = airports.removeValueForKey("DUB") {
    print("The removed airport's name is \(removedValue).")
} else {
    print("The airports dictionary doest not contain a value for DUB.")
}

使用for-in语法迭代Dictionary集合中的每个键值对,每个键值对以元祖类型(key, value)形式表现。

swift
for (airportCode, airportName) in airports {
    print("\(airportCode): \(airportName)")
}
© 2015-2022 tongqijie.com 版权所有沪ICP备17000682号