Swift 斯威夫特:消失数组内容的神秘案例
我有下面的Swift代码将从JSON解码的嵌套字典数组的内容提取到一个字典数组中,我可以用于SwiftUI列表视图(即可识别)。不管怎么说,这就是我为什么要这么做的原因,问题简单得多,但很奇怪Swift 斯威夫特:消失数组内容的神秘案例,swift,Swift,我有下面的Swift代码将从JSON解码的嵌套字典数组的内容提取到一个字典数组中,我可以用于SwiftUI列表视图(即可识别)。不管怎么说,这就是我为什么要这么做的原因,问题简单得多,但很奇怪 struct Salespeople : Codable { let salespeople: [Salesperson]? } struct Territory: Codable, Identifiable { let id: NSInteger let name: Strin
struct Salespeople : Codable {
let salespeople: [Salesperson]?
}
struct Territory: Codable, Identifiable {
let id: NSInteger
let name: String
}
struct Salesperson : Codable, Identifiable {
let id: NSInteger
let name: String
let territories: [[String:Territory]]?
var territoriesArray: [Territory]?
}
let salespeople = try! decoder.decode([[String:Salesperson]].self, from: dataResponse!)
var salespeopleArray:[Salesperson] = []
for salespersonDictionary in salespeople {
var salesperson = salespersonDictionary["salesperson"]!
salespeopleArray.append(salesperson)
salesperson.territoriesArray = [Territory]()
for territoryDictionary in salesperson.territories! {
let territory = territoryDictionary["territory"]!
salesperson.territoriesArray?.append(territory)
} // <<<< Breakpoint here
}
dump(salespeopleArray)
为什么我的领地消失了
谢谢你的阅读。这不是什么神秘的东西,这是一个特色 Swift数组和字典是值类型。这意味着线
var salesperson = salespersonDictionary["salesperson"]!
对Salesperson
实例进行复制,并将其分配给变量Salesperson
。您将要进行的更改将更改salesperson
的内容,但不会更改salesperson
中键salesperson
的值
var salespeople = try! decoder.decode([[String:Salesperson]].self, from: dataResponse!)
var salespeopleArray:[Salesperson] = []
for (index, salespersonDictionary) in salespeople.enumerated() {
var salesperson = salespersonDictionary["salesperson"]!
salespeopleArray.append(salesperson)
salesperson.territoriesArray = [Territory]()
for territoryDictionary in salesperson.territories! {
let territory = territoryDictionary["territory"]!
salesperson.territoriesArray?.append(territory)
}
salespeople[index] = salesperson
}
解决方案是将修改后的Salesperson
实例分配回数组salesperse
var salespeople = try! decoder.decode([[String:Salesperson]].self, from: dataResponse!)
var salespeopleArray:[Salesperson] = []
for (index, salespersonDictionary) in salespeople.enumerated() {
var salesperson = salespersonDictionary["salesperson"]!
salespeopleArray.append(salesperson)
salesperson.territoriesArray = [Territory]()
for territoryDictionary in salesperson.territories! {
let territory = territoryDictionary["territory"]!
salesperson.territoriesArray?.append(territory)
}
salespeople[index] = salesperson
}
因为数组是一种值类型?对Salesperson.territoriesArray的声明是什么?您不能在Salesperson.territories上调用
map
/compactMap
?@bg2b感谢您的回复。我已经将这些添加到问题中(在第一段代码摘录中)。@JoakimDanielson感谢您的回答。我最初尝试过这一点,但我无法克服以下问题:Territions结构是一个嵌套字典数组,根为“territory:”来自原始JSON,这正是我试图用map解决的问题,因此采用了手动方法。不过,我对斯威夫特还不熟悉,所以也许有一种方法可以解决这个问题。对您的[备受赞赏的]固定代码稍加修改,就是最后一句话需要是salespellarray[index]=salespellspells再次感谢。
var salespeople = try! decoder.decode([[String:Salesperson]].self, from: dataResponse!)
var salespeopleArray:[Salesperson] = []
for (index, salespersonDictionary) in salespeople.enumerated() {
var salesperson = salespersonDictionary["salesperson"]!
salespeopleArray.append(salesperson)
salesperson.territoriesArray = [Territory]()
for territoryDictionary in salesperson.territories! {
let territory = territoryDictionary["territory"]!
salesperson.territoriesArray?.append(territory)
}
salespeople[index] = salesperson
}