在 Swift 5 中更新 JSON 数组

Update JSON Array in Swift 5

我有一个从 url 获取的 JSON 数组,并使用 SwiftyJSON 进行转换。现在我想为某些功能更新 JSON 数组的一些值。

我的JSON就像

[
    {
      "id" : 48845152,
      "studentPhotoTakenCount" : 0,
      "updatedAt" : null,
      "isAttendedToday: false
    },
 {     "id" : 48845153,
      "studentPhotoTakenCount" : 0,
      "updatedAt" : null,
      "isAttendedToday: false
    },
  
  ]

经过一些操作后,我想通过过滤 ID 来更新我的 JSON 数组。 就像我有 id = 48845152 然后只更新

{
      "id" : 48845152,
      "studentPhotoTakenCount" : 0,
      "updatedAt" : null,
      "isAttendedToday: false
    }

并最终与我的 JSON 数组合并。所以最后的结果应该是

[
    {
      "id" : 48845152,
      "studentPhotoTakenCount" : 0,
      "updatedAt" : null,
      "isAttendedToday: false
    },
 {     "id" : 48845153,
      "studentPhotoTakenCount" : 0,
      "updatedAt" : null,
      "isAttendedToday: false
    },

  ]

我的代码就是这样。

self.studentList.forEach {
                        if let id = [=15=]["id"].int {
                            if id == _studentId {
                                [=15=]["isAttendedToday"] =  true
                                self.filteredStudentList.append([=15=])
                            }
                            else {
                                self.filteredStudentList.append([=15=])
                            }
                        }
                    }

这里 self.studentList 是我的 JSON。但是我得到的错误是

Cannot assign through subscript: '[=17=]' is immutable

请有人帮我找出这里出了什么问题。

使用此语法无法修改源数组,但可以修改目标数组

self.studentList.forEach {
    self.filteredStudentList.append([=10=])
    if let id = [=10=]["id"].int, id == _studentId {
       let lastIndex = self.filteredStudentList.count - 1
       self.filteredStudentList[lastIndex]["isAttendedToday"] = true
    }
}

如果要修改源数组,则必须使用此

for (index, item) in self.studentList.enumerated() {
    self.filteredStudentList.append(item)
    if let id = item["id"].int, id == _studentId {
       self.studentList[index]["isAttendedToday"] = true
    }
}

在这两种情况下,由于值类型语义,您必须直接修改数组。

PS:

在 Swift 5 中,没有理由再使用 SwiftyJSONCodable 更通用、更高效且内置。