Добавление значений словаря в массив в Swift - PullRequest
0 голосов
/ 11 апреля 2019

у меня есть словарь типа [String: Object], где MyObject - массив AnotherObject. Мне нужно отсортировать его, так как мне нужно заполнить UITableView количеством Keys.count разделов и Object.count количеством строк в каждом разделе. Я помещаю все ключи в массив, но когда я пытаюсь добавить значения в другой массив, я получаю Thread 1: EXC_BAD_ACCESS (code=1, address=0x8).

Это код, который я использую

var dictionary = [String: MyObject]()
var sortedKeys: [String]?
var sortedValues = [MyObject]()



func sortItems() {

        self.sortedKeys = self.dictionary.keys.sorted(by: >)

        let sortedDict = self.dictionary.sorted(by: {$0.key > $1.key})
        for (_, value) in sortedDict {
            print(value)
            self.sortedValues.append(value)
        }

    }

В цикле for, когда я не пытаюсь добавить значения в массив, он печатает все отсортированные значения, проблема возникает, когда я хочу, чтобы они были в массиве.

Редактировать

Словарь выглядит так:

struct Object: Decodable {
    let elements: [AnotherObject]
}

struct AnotherObject: Decodable {
    let time, Id, Status: Int?
    let date, startTime, endTime: String?
}

dictionary: [String: Object]

Таким образом, ключи являются числами (представляющими дни), и каждый день имеет объект с (по крайней мере) один другой объект. Я получаю JSON от API.

Заранее спасибо

Ответы [ 2 ]

4 голосов
/ 11 апреля 2019

Вам следует только отсортировать ключи, а затем использовать этот массив для выбора из словаря и добавления массива sortedValues.Я превратил sortedKeys в локальную переменную

func sortItems() {
    let sortedKeys = self.dictionary.keys.sorted(by: >)

    for key in sortedKeys {
        if let obj = dictionary[key] {
            self.sortedValues.append(obj)
        }
    }
}

Я не знаю, будет ли это иметь значение в случае сбоя, но другой способ - позволить функции возвращать массив

func sortItems() -> [Object] {
    let sortedKeys = self.dictionary.keys.sorted(by: >)
    var result: [Object]()

    for key in sortedKeys {
        if let obj = dictionary[key] {
            result.append(obj)
        }
    }
    return result
}

, а затем назовите его

self.sortedValues = sortItems()
2 голосов
/ 11 апреля 2019

Вы вообще не используете sortedKeys, и результатом сортировки словаря является массив кортежей, поэтому синтаксис перечисления словаря for (key, value) in неправильный

Возможно, вы хотитеэто

func sortItems() {

    let sortedKeys = self.dictionary.keys.sorted(by: >)

    for key in sortedKeys {
        let value = self.dictionary[key]!
        print(value)
        self.sortedValues.append(value)
    }
} 

Принудительное развертывание значения на 100% безопасно, поскольку ключ явно существует.

...