我有一个类型的字典
[String: Object]
,其中MyObject
是AnotherObject
的数组。我需要对它进行排序,因为我需要用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。
预先感谢
答案 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%安全的,因为密钥显然存在。