我在Swift的字典中遇到一个很大的问题。我有一些自定义类:团队,竞争和统计。 团队和竞争符合协议 Hashable 和 Equatable 。
字典看起来像这样:
[Team: [Competition: Statistics]]
。
此外,我有两个"整体价值观":团队和竞争。
当我执行以下操作时:
println(dictionary[overallTeam]!)
它打印竞赛的内存地址和您期望的统计数据。但是,当我执行以下操作时:
println(dictionary[overallTeam]![overallCompetition])
我得nil
作为输出。我完全不知道这一点,因为dictionary[overallTeam]!
中只有一个键与overallCompetition
同名。这意味着等号#{1}}返回 true ,并且hashValue相同。
请帮忙,问题出在哪里。
以下是代码:
在==
方法中,我执行以下操作:
init()
打印代码是在启动应用程序时调用的方法:
dictionary = [Team: [Competition: Statistics]]()
dictionary[overallTeam] = [Competition: Statistics]()
dictionary[overallTeam]![overallCompetition] = Statistics()
只是一个普遍的问题:字典键是基于hashValue的,不是吗?那么为什么使用相同的 hashValue做两个键不会产生相同的结果???
答案 0 :(得分:-1)
您无法将字符串与不同的对象类型进行比较并获得一致的结果,因为该关系不具有反身性。换句话说,虽然你可能已经实现了Equatable来说你的对象==字符串,但是不是因为string == object,这会破坏它。
由于您是按字符串名称索引数组,因此您永远不会使用overallCompetition
找到它。存储带有overallCompetition
的第二个字典作为值,或使用overallCompetition.name来提取值。