macOS 11.6 Xcode 12.5.3 the swift programming language-Swift 5.5 Time 21/10/10
1.dictionary 存储的是具有相同类型的 key 与具有相同类型的 value 的之间的对应关系的无序集合. dictionary中的每个 value都具有唯一的 key ,其就是 value 的标识.
2.dictionary 一般用于基于标识来查找值的情况. ( 基于 具有唯一性的key 来查找其对应的 value )
3.dictionary 中 key 的类型必须满足 Hasable protocol ( 哈希协议 ), 就像 set 的 value type一样
4.Swift中字典语法的完整写法是 Dictionary< Key, Value > , eg: Dictionary<Int : String>
5.Swift中字典语法的简写方法是 [ Key : Value ] , eg: [ Int : String ]
6.创建 empty dictionary 可以用初始化器语法 [ : ]
7.用 count( ) property 属性发现 dictionary 有几个 item. eg: 字典名.count( )
8.用 isEmpty property 属性判断 dictionary 的 count 是不是为 0, eg: 字典名.isEmpty
9.用 subscript syntax 下标语法 可以 增加 , 获取 或者 修改 dictionary 的item, eg: 字典名[ 键名 ]
10.增加或修改 dictionary 特定的键 key 对应的value, 也可以用 updateValue (_ : for key : ) method, 其一该方法返回的是一个 optional 类型的值, 其二 用该方法更新一个 item 后,其返回的是一个optinal old value ,也就是说如果原 dictionary 存在该键对应的值, 那么返回的就是这个该键对应的值的可选值,即相对于刚更新的 item 而言, 其返回的不是这个刚更新的 item 的 new value, 而是原来那个键对应的值的可选值,即optional old value; 如果原 dictionary 不存在该键对应的值, 那么更新完( 这里实际是添加 )新的 item 后 ,其返回的optional old value 该键对应的值就是 nil ( 因为不存在.) 因为这键可能发生不存在的情况,所有这也是为什么这个方法返回的类型是 optional 的原因.
11.移除 dictionary 的一对 key-value 键值对,可以通过给该 key键分配 nil 来实现. eg: 字典名[ 对应的key ] = nil
12.移除 dictionary 的一对 key-value 键值对,还可以用 removeValue( for key: ) method 来实现, 该方法返回的也是可选值, 如果原 dictionary 存在该键对应的值, 那么就返回该键对应的值的可选值, 如果不存在该键对应的值 ,就返回 nil eg: 字典名.removeValue ( for key: 对应的key )
13.用 for-in 循环遍历 dictionary 的 每一个item, 可将其decompose分解为 tuple 的形式, eg: for ( key, value ) in 字典名 { XXXX }
14.可以直接access 访问 dictionary 的 key 和 value property 属性用 eg: 字典名.keys 和 字典名.values
15.可以用字典的 keys 和 values 属性创建一个 array 的 instance, eg: [类型] ( 字典名.keys )
var namesOfIntegers: [Int :String] = [:]
namesOfIntegers[16] = "sixteen"
namesOfIntegers[9] = "night"
namesOfIntegers.count //2
namesOfIntegers.isEmpty //false
namesOfIntegers = [:]
@6-8 创建空字典,用下标语法给字典添加 item, 计算 item 个数,判断 count 是不是 0
var airPort = [
"YYZ" : "Toronto Pearson",
"DUB" : "Dublin"
]
airPort["LHR"] = "London"
airPort["LHR"] = "London Heathrow"
print(airPort)
for (key, value) in airPort {
print("\(key) : \(value)")
}
输出:
["LHR": "London Heathrow", "YYZ": "Toronto Pearson", "DUB": "Dublin"]
LHR : London Heathrow
YYZ : Toronto Pearson
DUB : Dublin
@9 下标语法给 dictionary airPort 添加 "LHR" : "London" item,再修改该 item
if let optionalOldValue = airPort.updateValue("new value", forKey: "DUB"){
print("原airport存在DUB的键,返回可选旧值的拆包 \(optionalOldValue)")
} else{
print("原airport不存在名为DDBUB的键")
}
print(airPort)
let optionalOldValue2 = airPort.updateValue("new value2", forKey: "DDUB")
print(optionalOldValue2)
print(airPort)
输出:
原airport存在DUB的键,返回可选旧值的拆包 Dublin
["YYZ": "Toronto Pearson", "LHR": "London Heathrow", "DUB": "new value"]
nil
["LHR": "London Heathrow", "DUB": "new value", "YYZ": "Toronto Pearson", "DDUB": "new value2"]
@10 updateValue() 返回的是可选的字符串旧值,故pdateValue()返回的是Optional("Dublin") ,但是这里用了 if let 拆包赋值, 故optionalOldValue 的类型就变成了纯字符串 String,故最后optionalOldValue的值就是 Dublin
optionalOldValue2 的类型是可选字符串 String? ,具体值是可选旧值,故但由于该键不存在,所以返回的可选旧值是 nil
airPort["LHR"] = nil
print(airPort)
输出: ["DUB": "new value", "YYZ": "Toronto Pearson", "DDUB": "new value2"]
@11 移除了 "LHR": "London Heathrow", "DUB"
if let removedItemValue = airPort.removeValue(forKey: "YYZ"){
print(removedItemValue)
}else{
print("不存在该 YYZ 键")
}
let removedItemValue2 类型是 String? = airPort.removeValue(forKey: "YYZ2")
print(removedItemValue2)
输出:
Toronto Pearson
nil
@12 removeValue(forKey: ) 返回的是可选旧值,由于原 dictionary 存在 YYZ 键,故返回的是 Optinal("Toronto Pearson"), 但这里用了 if let 拆包赋值,故removedItemValue类型是 String,故值是Toronto Pearson
由于原 dictionary 不存在 YYZ2 键, 故返回的可选旧值就是 nil,没有 if let 拆包赋值,故removedItemValue2 类型是 String?
for (airportCode, airportName) in airPort {
print("\(airportCode) : \(airportName)")
}
输出:
DUB : new value
DDUB : new value2
@13 for (键, 值) in 字典名 { } 遍历 dictionary 的 item
for airportCode in airPort.keys {
print(airportCode)
}
输出:
DUB
DDUB
@14
let airportCodes: [String] = [String](airPort.keys)
let airportNames = [String](airPort.values)
print(airportNames)
输出: ["new value", "new value2"]
@15
网友评论