Обновление массива JSON в Swift 5

#ios #json #swift #swift5 #swifty-json

#iOS #json #swift #swift5 #swifty-json

Вопрос:

У меня есть массив JSON, который извлекается из url и преобразуется с помощью SwiftyJSON. Теперь я хочу обновить некоторое значение массива JSON для некоторых функций.

Мой JSON похож

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

После некоторых действий я хочу обновить свой массив 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 = $0["id"].int {
                            if id == _studentId {
                                $0["isAttendedToday"] =  true
                                self.filteredStudentList.append($0)
                            }
                            else {
                                self.filteredStudentList.append($0)
                            }
                        }
                    }
 

Вот self.studentList мой JSON. Но я получаю сообщение об ошибке, в котором говорится, что

Невозможно назначить через нижний индекс: ‘$ 0’ является неизменяемым

Пожалуйста, кто-нибудь, помогите мне выяснить, что здесь не так.

Комментарии:

1. $ 0 [«isAttendedToday»] = true, эта строка вызывает проблему

Ответ №1:

С помощью этого синтаксиса вы не можете изменить исходный массив, но вы можете изменить целевой массив

 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
    }
}
 

В обоих случаях из-за семантики типа значения вам необходимо напрямую изменять массивы.

PS:

В Swift 5 больше нет причин использовать SwiftyJSON . Codable является более универсальным, более эффективным и встроенным.

Комментарии:

1. в вашем первом решении возникла ошибка, в которой говорилось: «Невозможно назначить свойство: «последнее» — это свойство, доступное только для получения». Но второй метод работает. Спасибо

2. Пожалуйста, посмотрите редактирование и имейте в виду, что оба предложения делают разные вещи.

3. большое вам спасибо, но можете ли вы описать, почему произошла ошибка «Невозможно назначить через нижний индекс: «$ 0″ является неизменяемым»??

4. $0 представляет текущий элемент в цикле. Это копия и рассматривается как let постоянная, поэтому неизменяемая.

5. Еще раз спасибо. На самом деле я новичок в Swift и учусь работать