美文网首页
Swfit基础之字典

Swfit基础之字典

作者: SimonMont | 来源:发表于2019-08-27 17:51 被阅读0次
    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基础之字典

          本文链接:https://www.haomeiwen.com/subject/tqcyectx.html