Swift学习(三:集合类型)
Swift 语言提供Arrays
、Sets
和Dictionaries
三种基本的集合类型用来存储集合数据。数组Arrays
是有序数据的集。集合Sets
是无序无重复数据的集。字典Dictionaries
是无序的键值对的集。
Swift 语言中的Arrays
、Sets
和Dictionaries
中存储的数据值类型必须明确。
1.数组
写法格式1:Array<Element>
写法格式2:[Element]
-
创建一个空数组
var arr = [Int]() 如果代码上下文提供了类型,可以使用空数组语句创建一个空数组 arr.append(3) //包含一个Int值 arr = [] //显示是[Int]类型的空数组
-
创建一个带有默认值的数组
var array = [Double](count:3, repeatedValue:0.0) //array 是 [Double]类型的数组,等价于[0.0, 0.0, 0.0]
-
两个数组相加创建数组
var arr + array
-
用字面量构造数组
var array2:[String] = ["aa","bb"]
注意:如果创建的是常量,则不可修改
-
访问和修改数组
*用数组的只读属性`count`来获取数组的数量: array.count *用布尔值`isEmpty`作为检查`count`属性的值是否为0 array.isEmpty *使用`append(:_)`方法在数组后面添加新的数据 array.append("cc") *赋值运算符`+=`也可以直接在数组后面添加数据 array += ["dd","ee"] *使用下标来获取数组中的数据 array[0] *用下标来修改某个已有索引值对应的数据值 array[1] = "ff" *可以用下标改变一系列值 array[2...3] = ["gg","hh"] *加数据到某个索引 array.insert("qq",atIndex:0) *可以使用下标来移除某个值 array.removeAtIndex(3) *移除数组的最后一项 array.removeLast()
注意:当增加或者删除非最后一行的值时,后续数据会自动前移。
-
数组遍历
for item in array{ print(item) }
如果我们同时需要数据的值和索引值,可以使用enumerate()
方法来进行数组遍历。
for (index,value) in array.enumerate(){
print("item:\(String(index+1): \(value))")
}
2.集合
一个类型为了存储在集合中,该类型必须是可哈希化的--也就是说,该类型必须提供一个方法来计算它的哈希值。一个哈希值是Int类型的,相等的对象哈希值必须相同,比如a==b
,因此必须a.hashValue == b.hashValue
。
Swift 的所有基本类型(比如String
,Int
,Double
和Bool
)默认都是可哈希化的,可以作为集合的值的类型或者字典的键的类型。没有关联值的枚举成员值(在枚举有讲述)默认也是可哈希化的。
注意:
你可以使用你自定义的类型作为集合的值的类型或者是字典的键的类型,但你需要使你的自定义类型符合 Swift 标准库中的Hashable协议。符合Hashable协议的类型需要提供一个类型为Int的可读属性hashValue。由类型的hashValue属性返回的值不需要在同一程序的不同执行周期或者不同程序之间保持相同。
因为Hashable协议符合Equatable协议,所以符合该协议的类型也必须提供一个"是否相等"运算符(==)的实现。这个Equatable协议要求任何符合==实现的实例间都是一种相等的关系。也就是说,对于a,b,c三个值来说,==的实现必须满足下面三种情况:
a == a(自反性)
a == b意味着b == a(对称性)
a == b && b == c意味着a == c(传递性)
-
集合类型的语法
var letter = Set<Character>() 如果代码上下文提供了类型,可以使用空数组字面量创建一个空`Set` letter.insert("a") //包含一个Character值 letter = [] //显示是[Character]类型的空数组
-
数组字面量创建集合
var letter1:Set<String> = ["aa","bb","cc","dd"]
-
访问和修改一个集合
*使用只读属性: letter.count *使用布尔属性检查`count`属性是否为0 letter.inEmpty *使用`insert()`方法添加一个新元素 letter.insert("hh") *用`remove()`方法删除一个元素 letter.remove("aa") *删除所有元素 letter.removeAll() *检查是否包含特定值 letter.contains("ss")
-
遍历一个集合
for genre in letter{ print("\(henre)") }
-
集合操作
3.字典
字典是一种存储多个相同类型的值的容器。每个值(value)都关联唯一的键(key),键作为字典中的这个值数据的标识符。
-
创建空字典
var dic = [Int:String]() 如果上下文已经提供了类型信息,我们可以使用空字典字面量来创建一个空字典,记作[:](中括号中放一个冒号): dic[16] = "ss" dic = [:]
-
用字典字面量创建字典
[key1 : value1, key2 : value2, key3 : value3]
var dic : [String : String] = ["aa":"AA", "bb":"BB", "cc":"CC"]
-
访问和修改字典
*通过制度属性count
来获取数量
dic.count
*使用布尔属性isEmpty
来检查count
属性是否等于0
if dic.isEmpty {
print("是空的")
}*使用下标语法来添加新的数据 dic["dd"] = "DD" *使用下标来修改值 dic["cc"] = "qq" *使用`updateValue(_:forKey:)`方法可以设置特定键对应的值,和上面的下标方法不同的,updateValue(_:forKey:)这个方法返回更新值之前的原值。这样使得我们可以检查更新是否成功。 let oldValue = dic.updateValue("ww",forKey:"aa") print (oldValue) // optional(AA)
注意:updateValue(_:forKey:)方法会返回对应值的类型的可选值。举例来说:对于存储String值的字典,这个函数会返回一个String?或者“可选 String”类型的值。
*使用下标来检索特定键对应的值,因为有可能请求的键没有值存在,所以返回的值时可选值
let value = dic["aa"]
print (value) // optional(AA)
*通过给某个值赋值为`nil`来从字典里移除一个键值对
dic["bb"] = nil
*也可以通过`removeValueForKey(_:)`方法移除键值对
-
字典遍历
for (key,value) in dic{ print("\(key):\(value)") } //(key,value)可以随便取名
-
单独遍历
keys
或者values
*遍历keys for key in dic.keys{ print(key) } *遍历values for value in dic.keys{ print(value) }
-
如果需要键或者值的集合来作为接受某个
Array
的参数,可以直接食用key
或者value
构造一个新数组let keyArr = [String](dic.keys) let valueARR = [String](dic.values)
-
Swift 的字典类型是无序集合类型。为了以特定的顺序遍历字典的键或值,可以对字典的
keys
或values
属性使用sort()
方法。