синтаксический анализ вложенных массивов для заполнения uitableview в swift

#arrays #swift #uitableview #decodable

#массивы #swift #uitableview #декодируемый

Вопрос:

Это ответ API, который я проанализировал

 {
"status": 0,
"message": "Friends found.",
"friends": [
    {
        "id": 52,
        "meetings": [
            {
                "id": 47,
                "meeting_with": "Bbb"
            }
        ]
    }
]
}
  

Класс модели

 struct TotalMeetings: Decodable {
var status: Int
var message: String
var friends: [FriendDetail]?
}
struct FriendDetail: Decodable {
var id: Int
var meetings: [MeetingsDetail]
}
struct MeetingsDetail: Decodable {
var id: Int
var meeting_with: String
}
  

Я вызываю API здесь, и вызов выполнен успешно.

 var meetingssData :Friends!
let decoder = JSONDecoder()
do{
   meetingsData = try decoder.decode(TotalMeetings.self, from: response.data!)
    let meet = [self.meetingsData!.friends].compactMap({$0}).flatMap({$0})
        print(meetingsData!) 
}catch{
    print(error)
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! FriendsMeetingTVC
    
    return cell
}
  

Пожалуйста, подскажите мне, как мне заполнить tableview ответом, поступающим от вызова API.

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

1. Я знаю, как создать tableview, я спрашиваю, как мне передать эти данные в tableview, какой подход будет использоваться?

2. Даже не ясно, что вы хотите отобразить. Для источника данных в виде таблицы требуется как минимум массив источников данных.

3. Ваша meetingsData должна быть переменной экземпляра, а не локальной, чтобы cellForRowAt можно было использовать массив FriendDetail . (Предполагая, что вы хотите показать друзей в своей таблице.)

Ответ №1:

  1. вы должны объявить экземпляр массива типа в соответствии с вашими потребностями либо FriendDetail, либо MeetingsDetail.

  2. После извлечения данных из api проанализируйте их и сохраните сопоставленные данные в экземпляре массива. Затем перезагрузите табличное представление.

  3. numberOfRowsInSection метод tableview возвращает количество строк, используя ваш счетчик массивов.

  4. Вы можете получить доступ к значению, используя точечную нотацию, как показано в методе «cellForRowAt indexPath:».

     class MeetingVC: UIViewController, UITableViewDelegate, UITableViewDatasource {
     var friendsArr = [FriendDetail]()
    
     func fetchFriendDetail() {
     let decoder = JSONDecoder()
     do {
         let meetingsData = try decoder.decode(TotalMeetings.self, from: response.data!)
         self.friendsArr = meetingsData.friends ?? []//[meetingsData.friends].compactMap({$0}).flatMap({$0})
         print(self.friendsArr) 
         self.tableView.reloadData()
     }catch{
         print(error)
     }
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
     return friendsArr.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
     let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! FriendsMeetingTVC
     cell.emailTxt.text = friendsArr[indexPath.row].email
     return cell
    }
    
    }
      

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

1. эй, это очень полезно и работает. Пожалуйста, один вопрос, как мне получить доступ к значениям [MeetingsDetail]

2. То же, что электронная почта:- friendArr[indexPath.row].meetings.

3. пусть meetingId = friendsArr[indexPath.row].meetings[indexPath.row].id я пытаюсь это сделать, но он показывает индекс ошибки вне диапазона