Swift 提供三种类型的集合来存储数据:
数组(Array):有序数据的集、集合(Set):无序无重复数据的集、字典(Dictionary):无序的键值对集合
这个三个集合存储的数据类型必须明确。(只能存单一数据类型)
1) 数组(Array)
Ø 创建数组:Array<Element>或 [Element] ,其中Element为数据类型,推荐简写形式。
var someInts= [Int]() //创建一个Int型的空数组
someInts.append(3)//给someInts添加一个值
someInts= [] //someInts为空数组,根据上下文推测其扔为[Int] 类型
Ø 创建一个带有默认值的数组
可以把准备加入新数组的数据项数量(count)和适当类型的初始值(repeatedValue)传入数组构造函数:
varthreeDoubles = [Double](count: 3, repeatedValue:0.5)
//threeDoubles 是一种 [Double] 数组,等价于 [0.5, 0.5, 0.5]
Ø 通过两个数组相加创建一个数组(“+“号运算)
varanotherThreeDoubles = Array(count: 3, repeatedValue: 2.5)
//anotherThreeDoubles 被推断为 [Double],等价于 [2.5, 2.5, 2.5]
var sixDoubles = threeDoubles +anotherThreeDoubles
// sixDoubles被推断为 [Double],等价于 [0.5, 0.5, 0.5,2.5, 2.5, 2.5]
Ø 用字面量构造数组
var shoppingList: [String] =["Eggs", "Milk"]
//swift 根据初始化的值推断类型为[String],类型可省略
var shoppingList = ["Eggs","Milk"]
Ø 访问和修改数组
² 数组下标从0开始到数组的长度-1
² Array.count 来获取数组长度
² Array.isEmpty 来判读数组是否为空
² Array.append(element:Element) 来追加数据
² 使用“+=“在数组后面添加一个或多个拥有相同类型的数据项
shoppingList += [“apple”,“chess”]
shoppingList+= ["Chocolate Spread", "Cheese", "Butter"]
² 使用下标获取数组的某一项
varfirstItem = shoppingList[0]
// 第一项是 "Eggs"
² 可以用下标来改变某个已有索引值对应的数据值
shoppingList[0]= "Six eggs"
// 其中的第一项现在是 "Six eggs" 而不是 "Eggs"
² 还可以利用下标来一次改变一系列数据值,即使新数据和原有数据的数量是不一样的
shoppingList[4...6]= ["Bananas", "Apples"]
//不可以用下标访问的形式去在数组尾部添加新项。
² 调用数组的insert(_:atIndex:)方法来在某个具体索引值之前添加数据项:
shoppingList.insert("MapleSyrup", atIndex: 0)
² 使用removeAtIndex(_:)方法来移除数组中的某一项
letmapleSyrup = shoppingList.removeAtIndex(0)
² 使用removeLast()移除数组的最后一项
letapples = shoppingList.removeLast()
Ø 数组的遍历
² 使用for-in循环来遍历所有数组中的数据项
for item in shoppingList { print(item) }
² 如果我们同时需要每个数据项的值和索引值,可以使用enumerate()方法来进行数组遍历。enumerate()返回一个由每一个数据项索引值和数据值组成的元组。我们可以把这个元组分解成临时常量或者变量来进行遍历:
for(index, value) in shoppingList.enumerate() {
print("Item \(String(index + 1)):\(value)")
}
2) 集合(Set)
集合(Set)用来存储相同类型并且没有确定顺序的值。当集合元素顺序不重要时或者希望确保每个元素只出现一次时可以使用集合而不是数组。
Ø 创建集合
varletters = Set<Character>() //构造函数创建
varfa:Set<String> = [“Rock”,“Classical”,“Hip hop”]
//数组字面量创建集合
//根据swift的推断能力,<String> 可省略
Ø 访问修改集合
² Set.count 来获取集合长度
² Set.isEmpty 来判读集合是否为空
² Set.insert (element:Element) 来插入数据
² Set.remove(member:Element):Element? 返回被删除元素
² Set.removeAll():void 删除所有元素
Ø 基本集合操作
两个集合a 和 b
² a.union(b) :合并
² a.intersect(b) :交集
² a.subtract(b) :a减去b与a交集(相同)的元素
² a.exclusiveOr(b):或操作(取a或b中的值,单不在a和b中的值)
注:上面几种方法都返回一个新的集合
² a.isSubsetOf(b):a是否是b的子集合
² a.isSupersetOf(b):a是否是b的父集合
² a.isStrictSubsetOf(b): a是否是b的子集合(a与b不相等)
² a.isStrictSupersetOf(b): a是否是b的父集合(a与b不相等)
² a.isDisjointWith(b):a与b是否有相同的元素
² a == b: a与b是否相等
注:这几种方法都返回Bool值
3) 字典(Dictionary)
字典是一种存储多个相同类型的值的容器。每个值(value)都关联唯一的键(key),键作为字典中的这个值数据的标识符。和数组中的数据项不同,字典中的数据项并没有具体顺序。
Ø 创建字典
Swift 的字典使用Dictionary<Key, Value>定义,其中Key是字典中键的数据类型,Value是字典中对应于这些键所存储值的数据类型。
以用[Key:Value]
这样快捷的形式去创建一个字典类型。虽然这两种形式功能上相同,但是后者是首选。
varnamesOfIntegers = [Int: String]()
//namesOfIntegers 是一个空的 [Int: String] 字典,它的键是Int型,值是String型
namesOfIntegers[10]= “10”
namesOfIntegers= [:]
//namesOfIntegers又成为了一个 [Int: String] 类型的空字典
² 字面量创建字典
varairports: [String: String] = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
varairports = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
//简写方式
Ø 访问和修改字典
² Dictionary.count 来获取集合长度
² Dictionary.isEmpty 来判读集合是否为空
² 用下标语法来添加/修改新的数据项
airports["LHR"] = "London"
下标语法来改变特定键对应的值
airports["LHR"] = "Londonss"
² Dictionary.updateValue(_:forKey:)设置或者更新特定键对应的值
键不存在:设置新值
键存在:更新值
返回:更新之前的值(可选),如果值不存在则返回nil
airports.updateValue(“DDD”,forKey:“DUB”)
² Dictionary. removeValueForKey(_:)移除键值对
键值对存在:返回移除的值
键的值不存在:返回nil
Ø 字典遍历
² 以元组方式遍历
for(airportCode, airportName) in airports {
print("\(airportCode): \(airportName)")
}
// YYZ:Toronto Pearson
// LHR:London Heathrow
² 访问keys或者values属性,可以遍历字典的键或者值:
forairportCode in airports.keys {
print("Airport code: \(airportCode)")
}
// Airport code: YYZ
//Airport code: LHR
forairportName in airports.values {
print("Airport name: \(airportName)")
}
//Airport name: Toronto Pearson
//Airport name: London Heathrow
² 使用keys或者values属性构造一个新数组:
letairportCodes = [String](airports.keys)
//airportCodes 是 ["YYZ", "LHR"]
letairportNames = [String](airports.values)
//airportNames 是 ["Toronto Pearson","London Heathrow"]