Swift 当要求排序时,可排序字典崩溃

Swift 当要求排序时,可排序字典崩溃,swift,dictionary,jquery-ui-sortable,Swift,Dictionary,Jquery Ui Sortable,我决定在Swift中创建我自己的SortableDictionarystruct,在Xcode操场上构建它,这样我就可以一边测试它SortableDictionary的工作原理是使用字典和排序函数,并使用排序函数从字典中创建键的排序数组。它可以按字典键或字典值进行排序,并且每个都有单独的排序(使用Bool值在两者之间切换)。我知道findInsertionIndex可以正常工作,我对insert和sort充满信心。但每当我试图创建一个可排序字典实例时,我总是得到 Execution was in

我决定在Swift中创建我自己的
SortableDictionary
struct,在Xcode操场上构建它,这样我就可以一边测试它
SortableDictionary
的工作原理是使用字典和排序函数,并使用排序函数从字典中创建键的排序数组。它可以按字典键或字典值进行排序,并且每个都有单独的排序(使用Bool值在两者之间切换)。我知道
findInsertionIndex
可以正常工作,我对
insert
sort
充满信心。但每当我试图创建一个
可排序字典
实例时,我总是得到

Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_1386_INVOP, subcode-0x0)
不管我怎么努力。在hear上发布之后,我发现只有当SortableDictionary必须处理具有多个值的字典时,才会发生错误。给它传递一个有一个或没有值的字典,它就会工作。因此,这将起作用:

let collection: [String: Double] = ["Bananas": 5]
var sortedDictionary2 = SortableDictionary(dictionary: collection, sortByValues: true, valueSortKey: {$0 < $1}, keySortKey: {$1 < $0})

var collection: [String: Double] = ["Bananas": 5]
var sortedDictionary2 = SortableDictionary(dictionary: collection, sortByValues: true, valueSortKey: {$0 < $1}, keySortKey: {$1 < $0})
尽管sortingByValues为true,这意味着该函数甚至不应该被调用(我仔细检查了这一点,sortingByValues在if语句时为true,但是Xcode坚持执行else分支)。然后我重写了代码,从使用全局变量切换到传递给每个函数的参数。这将错误代码移到了insert中的行:

sortedKeys = sortedKeys.filter {$0 != key}
字典中键:值对的数目似乎不再对错误产生任何影响。我仍然不知道发生了什么,但我已经为我的可排序字典创建了一个要点,并将修改后的函数代码的两个版本附加到末尾(一次只使用一个)。以下是我的可排序字典代码:


修复编译错误后,我执行了以下操作,效果良好:

let dict=SortableDictionary(valueSortKey:{$0<$1})

这也起到了作用:

var sortedDictionary=SortableDictionary(dictionary:collection,keySortKey:{$0>$1})

这一点也是如此:

var sortedDictionary=SortableDictionary(dictionary:collection,valueSortKey:{$0<$1})

上述两个集合的声明如下:
let collection:[String:Double]=[:]
我终于明白了。这是一个结束案例错误(在编码中,在问题的中间从来没有任何错误,只有在它的结尾),我没有正确处理当开始时(即当SoRID密钥为零或一个成员时)将键排序成排序密钥。我修复了这个问题,并为一些新增功能添加了SortedValue,现在一切都正常了。您可以给它一个字典和一个键或值排序方法,或者两者都给,它将创建正确的sortedKeys和sortedValues数组。我已经在Gist上更新了我的代码。

我很高兴您对自己的代码有信心,但当我将Gist复制/粘贴到游戏中时,会出现三个单独的编译错误。@DanielT。你能再具体一点吗?比如什么,在哪里?!?你导入了基础吗?你在一个不在GIST中定义的两个地方使用一个函数<代码>回合<代码> >你错过了一个<代码>!代码>在一个地方。我确信如果你把你的主旨复制到一个空白的操场上,你会看到同样的问题。正如我之前所说的,你必须导入基金会,但是我在哪里漏掉了一个“!”?找到了“!”,为什么XCODE以前从来没有抱怨过?!?另外,当我尝试{$0>$1}时,我总是会得到一个“模糊使用运算符>”,你如何让它接受“>”?正如我在问题中所指出的,似乎只有当字典中只有一个以上的元素,并且它崩溃时,它才起作用。有没有关于如何让它真正起作用的建议?
if (keySortKey!(sortedKeys[upperBound], key))
sortedKeys = sortedKeys.filter {$0 != key}