import UIKit
//字典: 无序的,可随机访问的集合数据结构
enum Setting {
case text(String)
case int(Int)
case bool(Bool)
}
let defaultSetting: [String: Setting] = [
"Airplane Mode": .bool(false),
"name": .text("My iPhone")
]
print(defaultSetting["name"])
//思考:为什么字典查找的键不存在时,返回nil,而数组下标越界时程序反而会崩溃?
/// 对于数组来说,swift很少直接使用索引获取值,即使使用到索引,这个索引一般是计算出来的。也就是说,使用无效索引一般是由程序员的失误导致的。而另一方面,字典的键往往是从其他渠道来的(比如服务器),从字典本身获取键是十分少见的。 此外,数组的下表是连续的,而字典的键是稀疏结构,一个键“name”对下一个键“age”毫无帮助
///
// Mark: 合并两个字典
var settings = defaultSetting
let overrideSettings: [String:Setting] = ["name": .text("Tony's iPhone")]
//第一个参数是要合并的键值对,第二个参数定义如何合并两个相同键的两个值
let re = settings.merging(overrideSettings, uniquingKeysWith: {$1})
print(re)
//??????????
//let re2 = Dictionary(uniqueKeysWithValues:nil )
//print(re2)
// Mark: 判断key重复次数
extension Sequence where Element : Hashable {
var frequncies:[Element:Int] {
let result = self.map{($0, 1)}
return Dictionary(result, uniquingKeysWith: +)
}
}
// Mark: mapValues: 以字典的方式返回map之后的结果
let re2 = defaultSetting.mapValues { (setting) -> String in
switch setting {
case .bool(let value):
return String(value)
case .int(let value):
return String(value)
case .text(let value):
return value
}
}
print(re2)
// Mark: Hashable
///字典其实就是哈希表,字典通过hashValue来为每一个键指定一个位置,以及它所对应的存储,所以,Key必须遵循Hashable协议标准库中的基本数据类型都遵循了Hashable协议,包括字符串,整数,浮点数以及布尔值
///Mark: 自定义类型用作Key
///1、实现Hashable协议,哈希值的计算必须满足 “哈希不变原则”
///2、重载 == 运算符因为Hashable是对�Equaable协议的扩扎,
///Mark: 哈希不变原则
///两个相同的实例,必须有用相同的哈希值;两个哈希值相同的实例,未必相等
///哈希值l可能重复这一特性,意味着Dictionary必须能够处理哈希碰撞。不必说优秀的哈希算法总能给出较少的碰撞,这将保持集合的性能特性。理想状态下,h我们希望哈希值在整个证书范围内平均分布。在极端情况下,如果所有的哈希值都相等,那么这个字典的性能查找将下降到O(n)
Swfit基础之字典
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 1.字典 字典属于一个新的数据结构,称之为映射字典也称之为 键值对(key - value)结构 ,每个键值对称之...
- 之前总结了Python列表,这篇总结Python的元组,字典和集合。 一 元组 tuple Python 的元组与...