У меня есть массив 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» неизменяем.
Пожалуйста, кто-нибудь, помогите мне выяснить, что здесь не так.





С помощью этого синтаксиса вы не можете изменить исходный массив, но вы можете изменить целевой массив
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 более универсальный, более эффективный и встроенный.
ваше первое решение получило некоторую ошибку, говорящую: «Невозможно назначить свойство:« последнее »является свойством только для чтения». Но второй способ работает. Спасибо
Пожалуйста, просмотрите редактирование и имейте в виду, что оба предложения делают разные вещи.
Большое спасибо, но можете ли вы описать, почему произошла ошибка «Невозможно назначить через индекс:« $ 0 »неизменяемо» ??
$0 представляет текущий элемент в цикле. Это копия и рассматривается как let константа, поэтому неизменяемая.
Еще раз спасибо. На самом деле я новичок в быстром и учусь с работой
$0["isAttendedToday"] = true, эта строка вызывает проблему