2015-01-05 35 views
0

我在Swift中的字典中遇到了一个很大的问题。我有一些自定义类:团队,竞争统计团队比赛符合协议哈希可衡量的Swift dictionary does not working

字典看起来像这样: [Team: [Competition: Statistics]]

此外我有两个“总体价值”:团队竞争

当我做到以下几点: println(dictionary[overallTeam]!)

它打印出的竞争和统计数据,你会期望的内存地址。但是,当我执行以下操作时: println(dictionary[overallTeam]![overallCompetition])

我得到nil作为输出。我完全想知道,因为dictionary[overallTeam]!中只有1个密钥,它与overallCompetition同名。这意味着等号==返回true和hashValue是相同的。

请帮忙,哪里会是这个问题。

下面的代码:

init()方法我做到以下几点:

dictionary = [Team: [Competition: Statistics]]() 
dictionary[overallTeam] = [Competition: Statistics]() 
dictionary[overallTeam]![overallCompetition] = Statistics() 

打印的代码是在启动应用程序时调用的方法:

println(overallCompetition.name) //"overallCompetition" 
println(overallCompetition.hashValue) //some hashCode, e.g. 5 
for item in dictionary[overallTeam]!.keys { //executed once 
    println(item.name) //"overallCompetition" 
    println(item.hashValue) //SAME hashCode, e.g. 5 
    println(dictionary[overallTeam]![item]!.value) //prints the value expected 
} 
println(dictionary[overallTeam]) //prints some memory addresses 
println(dictionary[overallTeam]![overallCompetition]) //nil 
println(dictionary[overallTeam]![overallCompetition]!.value) //error: unexpectedly found nil 

刚一个普遍的问题:字典键是基于hashValue的,不是吗?然后为什么做两个键与相同 hashValue不会产生相同结果???

+1

请问您可以发布设置和打印字典变量的代码。 –

+0

您的词典将内部词典定义为具有统计密钥,但内部词典使用PlayerStatistics键进行初始化,然后将该值初始化为统计对象...是统计PlayerStatistics的子类或是PlayerStatistics统计的子类,因为你的代码暗示着两者都是彼此的子类。将内部字典的值类型更改为统计信息并查看是否有效。 – ad121

+0

哦,对不起,忘了改变它,改变了名字,以便它们在这里不那么久。 – borchero

回答

0

您不能将字符串与不同的对象类型进行比较并获得一致的结果,因为该关系不是自反的。换句话说,虽然你可能已经实现了Equatable来说你的对象==字符串,但并不是因此string ==对象,这会破坏它。

既然你是通过字符串名称索引数组,那么你永远不会用overallCompetition找到它。将第二个字典存储为overallCompetition作为值,或使用overallCompetition.name提取值。

+0

我没有比较字符串与对象 - 只比较两个对象的两个字符串 – borchero

+0

您的代码表明'overallCompetition'是一个对象类型,并且您发布的代码表明您的字典通过字符串存储键。所以你的代码或者需要在其查找中使用'overallCompetition.name',或者你需要将对象存储为关键字。 – AlBlue

+0

关键是外部字典中的Team对象和内部字段中的竞争对象 – borchero