Swift 斯威夫特:消失数组内容的神秘案例

Swift 斯威夫特:消失数组内容的神秘案例,swift,Swift,我有下面的Swift代码将从JSON解码的嵌套字典数组的内容提取到一个字典数组中,我可以用于SwiftUI列表视图(即可识别)。不管怎么说,这就是我为什么要这么做的原因,问题简单得多,但很奇怪 struct Salespeople : Codable { let salespeople: [Salesperson]? } struct Territory: Codable, Identifiable { let id: NSInteger let name: Strin

我有下面的Swift代码将从JSON解码的嵌套字典数组的内容提取到一个字典数组中,我可以用于SwiftUI列表视图(即可识别)。不管怎么说,这就是我为什么要这么做的原因,问题简单得多,但很奇怪

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
}