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

时间:2014-11-29 19:02:30

标签: swift dictionary jquery-ui-sortable

我决定在Swift中创建自己的SortableDictionary结构体,在Xcode游乐场中构建它,这样我就可以随时测试它。 SortableDictionary通过获取字典和排序函数并使用sort函数从字典中创建排序的键数组来工作。它可以按字典键或字典值进行排序,并且每个都有不同的排序(Bool值可以在两者之间切换)。我知道findInsertionIndex按预期工作,我对insertsort充满信心。但每当我尝试创建SortableDictionary实例时,我一直在

Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_1386_INVOP, subcode-0x0)

无论我尝试了什么。在发布听后,我发现只有在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})

但这不会:

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

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

然后我从SortableDictionary结构中删除了sort,insert和两个findInsertionIndex方法以及所有未计算的全局变量。这将错误移动到findInsertionIndex(键排序版本)中的行:

if (keySortKey!(sortedKeys[upperBound], key))

尽管sortedByValues是真的这意味着甚至不应该调用函数(我仔细检查了这一点,在if语句时sortByValues为真,但Xcode坚持执行else分支)。因此,我重写了最小的代码,从使用全局变量切换到传递给每个函数的参数。这会将错误代码移到insert:

中的行
sortedKeys = sortedKeys.filter {$0 != key}

字典中的Key:Value对的数量似乎不再对错误产生任何影响。我仍然不知道发生了什么,但我已经为我的可排序字典创建了一个Gist,并将我修改过的函数代码的两个版本追加到最后(一次只使用一个)。这是我的可排序字典代码:

https://gist.github.com/7OOTnegaTerces/6277116470d03b4676c5

2 个答案:

答案 0 :(得分:0)

一旦我修复了编译错误,我就做了以下工作并且工作正常:

let dict = SortableDictionary<String, Int>(valueSortKey: { $0 < $1 })

这也有效:

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

这样做了:

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

以上两个集合声明如下: let collection: [String: Double] = [:]

答案 1 :(得分:0)

我终于明白了。这是一个结束错误(在编码中,问题中间从来没有任何错误,只有在它的结尾),我没有正确处理在第一次启动时将键排序到sortedKeys(即sortKeys时)有零个或一个成员)。我修复了这个问题,并为一些附加功能添加了sortedValues,现在一切正常。你可以给它一个字典和一个键或值排序方法,或两者​​兼而有之,它将排序创建正确的sortedKeys和sortedValues数组。我已在Gist上更新了我的代码:https://gist.github.com/7OOTnegaTerces/6277116470d03b4676c5