如何在swift3中将字典插入Set?

Posted

技术标签:

【中文标题】如何在swift3中将字典插入Set?【英文标题】:How to insert Dictionary into Set in swift3? 【发布时间】:2018-04-08 08:13:35 【问题描述】:

我有一个简单的字典,其定义如下:

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

我想在这张地图中添加“dic”:

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

_ = map.insert(dic as NSDictionary)

我不想使用 'dic as NSDictionary'。

但我不知道如何执行我在互联网上搜索了很多但没有任何帮助的操作。

【问题讨论】:

let dic:NSDictionary = ["key" : "value"] 试试这个? 只是好奇,为什么你首先需要一套字典?用例是什么? 你对两个简单字典相等的定义是什么? 【参考方案1】:

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

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

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

_ = map.insert(dic as NSDictionary)

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

类型“字典”不符合协议 '可哈希'

那是什么意思?以及如何解决?

这个集合是 Swift 中的一种特殊集合,因为它不能有重复的元素,这会导致询问“如何确定字典是唯一的”。

作为一种解决方法,您可以实现类似于以下内容的扩展:

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)

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

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)

【讨论】:

以上是关于如何在swift3中将字典插入Set?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 3 中将字典表示为 NSValue?

如何在ansible中将字典或列表转换为字符串

如何在 wpf 中将新行添加到数据网格中?

如何使用串联 ID 在 SQL Server 的循环中将表插入 N 次?

我如何在 swift3 中将单例类作为委托人

如何在swift3中将每个tableViewcell数据发送到collectionview