在 Swift 5 中更新 JSON 数组

问题描述

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

我的 JSON 就像

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

一些操作后,我想通过过滤 id 来更新我的 JSON 数组。 就像如果我有 id = 48845152 那么只更新

{
      "id" : 48845152,"isAttendedToday: false
    }

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

[
    {
      "id" : 48845152,]

我的代码就是这样。

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

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

不能通过下标赋值:'$0'是不可变的

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

解决方法

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

self.studentList.forEach {
    self.filteredStudentList.append($0)
    if let id = $0["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
    }
}

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

附注:

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