2014-11-29 2 views
0

Я решил создать свою собственную структуру SortableDictionary в Swift, построив ее на игровой площадке Xcode, чтобы я мог ее протестировать, когда я пошел. SortableDictionary работает, беря словарь и функцию сортировки и используя функцию сортировки для создания отсортированного массива ключей из словаря. Он может сортировать по словарным клавишам или значениям словаря и иметь отдельные сортировки для каждого (с помощью значения Bool для переключения между ними). Я знаю, что findInsertionIndex работает так, как предполагается, и я уверен в insert и sort. Но всякий раз, когда я пытался создать 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}) 

Затем я вырезал сортировки, вставки, и два метода findInsertionIndex от структуры SortableDictionary вместе со всеми Неправительственными рассчитан глобальными переменными , Это переместил ошибку в строке в findInsertionIndex (версия ключа сортировки):

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

это несмотря на то, что sortingByValues ​​было правдой, которая означает, что функция не должна была когда-либо даже называли (я проверил это, sortingByValues ​​верно во время инструкции if, но Xcode настаивает на том, чтобы вместо этого выполнить ветку else). Итак, я переписал код минимального минимума, чтобы перейти от использования глобальных переменных к параметрам, переданным в каждую функцию. Это переместили код ошибки в строке в вкладышем:

sortedKeys = sortedKeys.filter {$0 != key} 

Число пар ключ: значение в словаре больше не оказывает какого-либо влияния на ошибку. Я до сих пор не знаю, что происходит, но я создал Gist для моего сортируемого словаря и добавлю обе версии моего модифицированного функционального кода до конца (используйте только по одному). Вот мой Сортируемый словарь код:

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

+1

Я рад, что вы уверены в своем коде, но когда я копирую/вставляю ваш gist на площадку, я получаю три отдельных ошибки компиляции. –

+0

@ DanielT. Не могли бы вы быть более конкретными? Как что и где?!? Вы импортировали Фонд? –

+0

Вы используете функцию 'round' в двух местах, которые не определены в gist, и вам не хватает'! 'В одном месте. Я уверен, что если вы скопируете свой паштет на пустую площадку, вы увидите те же проблемы. –

ответ

0

я, наконец, понял это. Это была ошибка конечного случая (при кодировании никогда не было ошибок в середине проблемы, только на ее концах), я не занимался должным образом сортировкой ключей в sortedKeys при первом запуске (т. Е. Когда sortedKeys имеет ноль или один член). Я исправил это и добавил sortedValues ​​для некоторых дополнительных функций, и все это работает сейчас.Вы можете дать ему словарь и либо метод сортировки ключей или значений, либо и то, и другое, и он будет сортировать, создавая правильные sortedKeys и sortedValues. Я обновил свой код на Gist: https://gist.github.com/7OOTnegaTerces/6277116470d03b4676c5.

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] = [:]

+0

Как я уже говорил, вам нужно импортировать Foundation, но где я пропустил «!»? –

+0

Найдено «!», Почему Xcode не жаловался на это раньше?!? Кроме того, я всегда получаю «Неоднозначное использование оператора» при попытке {$ 0> $ 1}, как вы его принимаете ">"? –

+0

Как я уже отмечал в своем вопросе, он работает только в том случае, если словарь содержит не более одного элемента, больше, и он падает. Любые предложения о том, как сделать это НАСТОЯТЕЛЬНО работать? –

Смежные вопросы