Использование массивов JSON в Swift - PullRequest
0 голосов
/ 12 октября 2018

У меня проблемы с доступом к информации, которая хранится в JSON API, когда она находится внутри [] скобок, а не {} скобок.Я пытаюсь найти массив и найти набор {}, который соответствует "job": "director".Проблема в том, что если я не использую представление IndexPath, такое как CollectionView, я не могу получить доступ к информации, расположенной в скобках [].

JSON:

"crew": [
{
  "credit_id": "57ea3a02c3a3687edc00080a",
  "department": "Directing",
  "gender": 2,
  "id": 51329,
  "job": "Director",
  "name": "Bradley Cooper",
  "profile_path": "/z5LUl9bljJnah3S5rtN7rScrmI8.jpg"
},
{
  "credit_id": "57ea3a14c3a3687ff9007bd7",
  "department": "Writing",
  "gender": 2,
  "id": 51329,
  "job": "Screenplay",
  "name": "Bradley Cooper",
  "profile_path": "/z5LUl9bljJnah3S5rtN7rScrmI8.jpg"
},
{
  "credit_id": "57ea3a27925141108f008807",
  "department": "Writing",
  "gender": 2,
  "id": 224385,
  "job": "Screenplay",
  "name": "Will Fetters",
  "profile_path": null
}
],

Вот часть моегокод:

struct Cast: Codable {
    let character: String
    let name: String
    let profile_path: String?
}

struct Crew: Codable {
    let name: String
    let profile_path: String?
    let job: String
}

func loadCredits() {

    let id = filmId
    let apiKey = ""
    let url = URL(string: "https://api.themoviedb.org/3/movie/\(id)/credits?api_key=\(apiKey)")
    let request = URLRequest(
        url: url! as URL,
        cachePolicy: URLRequest.CachePolicy.reloadIgnoringLocalCacheData,
        timeoutInterval: 10 )

    let session = URLSession (
        configuration: URLSessionConfiguration.default,
        delegate: nil,
        delegateQueue: OperationQueue.main
    )

    let task = session.dataTask(with: request, completionHandler: { (dataOrNil, response, error) in
        if let data = dataOrNil {
            do { let credit = try! JSONDecoder().decode(Credits.self, from: data)
                self.filmCast = credit.cast
                self.filmCrew = credit.crew


                self.castCollection.reloadData()

            }
        }

        self.castCollection.reloadData()

    })

    task.resume()
}

Я могу использовать это для доступа к информации через indexpath как таковой:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = castCollection.dequeueReusableCell(withReuseIdentifier: "castCell", for: indexPath) as! CastCell

        let credit = filmCast[indexPath.row]
        let name = credit.name

        cell.castName.text = name


        return cell


}

Но у меня возникают проблемы при поиске данных без их нахождения в IndexPathпредставление, такое как UICollectionView.

Поэтому, если я хочу найти job, то есть Director вне представления коллекции, я пытаюсь:

if filmCrew.job == "Director" {
 perform action here
  }

Я получаю ошибку:

У значения типа '[DetailsView.Crew]' нет члена 'job'

Поэтому у меня вопрос, как правильно выполнить поиск в массиве JSON, чтобы найтисопоставление {} данных на основе сопоставления значения.Извините, если вопрос звучит глупо или запутанно, у меня просто были проблемы с этим, так как я использовал словари и массивы.Он всегда работает нормально, когда я индексирую его в представлениях таблиц и коллекций, но я не могу понять, как просеивать массив.

1 Ответ

0 голосов
/ 12 октября 2018

Ваше условие должно пройти через весь массив filmCrew и найти первого пользователя, у которого есть задание "Director", к счастью, есть метод, который это делает.

if let director = filmCrew.first(where: { $0.job == "Director" }) {
    //perform action here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...