如何在swift3中将Dictionary插入Set?

时间:2018-04-08 08:13:36

标签: swift dictionary set nsdictionary

我有简单的词典,定义如下:

let dic = ["key" : "value"]

我想在此地图中添加'dic':

var map = Set<NSDictionary>()
//    var map = Set<Dictionary<String,String>>()

_ = map.insert(dic as NSDictionary)

我不想使用'dic as NSDictionary'。

但我不知道我怎么能在互联网上搜索很多这个动作,但没有什么可以帮助我。

1 个答案:

答案 0 :(得分:0)

无论填写一组词典的目的是什么,请注意声明的dic类型不是 NSDictionary,而是一个-Swift-字典字符串键和字符串值([String : String])。

因此,您可以将集合声明为:

let dic = ["key" : "value"]
var map = Set<Dictionary<String, String>>()

_ = map.insert(dic as NSDictionary)

但是这里有问题!你会得到:

  

Type&#39; Dictionary&#39;不符合协议   &#39;可哈希&#39;

那么这意味着什么?以及如何解决它?

该集合在Swift中是一种特殊的集合,因为不能具有重复的元素,这导致询问&#34;如何确定字典是唯一的&#34;。

作为解决方法,您可以实现类似于:

的扩展程序
extension Dictionary: Hashable  {
    public var hashValue: Int {
        return self.keys.map { $0.hashValue }.reduce(0, +)
    }

    public static func ==(lhs: Dictionary<Key, Value>, rhs: Dictionary<Key, Value>) -> Bool {
        return lhs.keys == rhs.keys
    }
}

因此你可以这样做:

let dic1 = ["key" : "value"]
let dic2 = ["key2" : "value"]
let dic3 = ["key3" : "value"]
let dic4 = ["key2" : "value"]
let dic5 = ["key3" : "value"]

var map = Set<Dictionary<String, String>>()

_ = map.insert(dic1)
_ = map.insert(dic2)
_ = map.insert(dic3)
_ = map.insert(dic4)
_ = map.insert(dic5)

print(map) // [["key2": "value"], ["key": "value"], ["key3": "value"]] (unordered)

请注意,基于上面实现的扩展,您还可以声明一组ints键和ints值的字典 - 例如 - :

var intsMap = Set<Dictionary<Int, Int>>()

var d1 = [1: 12]
var d2 = [2: 101]
var d3 = [1: 1000]

intsMap.insert(d1)
intsMap.insert(d2)
intsMap.insert(d3)

print(intsMap) // [[2: 101], [1: 12]] (unordered)