Swfit基础之字典

2019-08-27  本文已影响0人  SimonMont
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)

上一篇下一篇

猜你喜欢

热点阅读