#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 и учусь работать