在Swift中将字典值追加到数组

时间:2019-04-11 07:08:12

标签: arrays swift dictionary exc-bad-access

我有一个类型的字典 [String: Object],其中MyObjectAnotherObject的数组。我需要对它进行排序,因为我需要用Keys.count个部分的数量和Object.count个行的数量来填充UITableView。我将所有键放在一个数组中,但是当我尝试将值附加到另一个数组中时,我得到了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]

因此,键是数字(代表天),并且每天都有一个(至少)一个anotherObject的Object。 我从API获取了JSON。

预先感谢

2 个答案:

答案 0 :(得分:4)

您应该只对键进行排序,然后使用该数组从字典中进行选择并追加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()

答案 1 :(得分:2)

根本不用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%安全的,因为密钥显然存在。