У меня проблемы с доступом к информации, которая хранится в 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, чтобы найтисопоставление {}
данных на основе сопоставления значения.Извините, если вопрос звучит глупо или запутанно, у меня просто были проблемы с этим, так как я использовал словари и массивы.Он всегда работает нормально, когда я индексирую его в представлениях таблиц и коллекций, но я не могу понять, как просеивать массив.