HotPepperAPIから取得した飲食店情報をリスト表示するために、下記コードを書きました。
swift
1import SwiftUI 2import Foundation 3import Combine 4 5class RestaurantStore: ObservableObject { 6 7 @Published var restaurants: [Restaurant] = [] 8 9 init() { 10 load() 11 //④ 12 } 13 14 func load() { 15 let url = URL(string: "http://webservice.recruit.co.jp/hotpepper/gourmet/v1/?key=[APIキー]&large_area=Z011&format=json") 16 URLSession.shared.dataTask(with: url!) { data, response, error in 17 DispatchQueue.main.async { 18 self.restaurants = [try! JSONDecoder().decode(Restaurant.self, from: data!)] 19 //③ 20 } 21 }.resume() 22 // ② 23 } 24} 25 26struct Restaurant: Decodable{ 27 var results: Results 28 29 struct Results: Decodable { 30 var shop: [Shop] 31 32 struct Shop: Decodable, Identifiable { 33 var id: String 34 var name: String 35 } 36 37 } 38} 39 40struct SearchView: View { 41 42 @ObservedObject var store = RestaurantStore() 43 44 var body: some View { 45 List(store.restaurants[0].results.shop) {(res) in //① 46 RestaurantRow(res: res) 47 } 48 } 49} 50 51struct RestaurantRow: View { 52 var res: Restaurant.Results.Shop 53 var body: some View { 54 Text(res.name) 55 } 56} 57
json
1{ 2results: { 3 api_version: "1.26", 4 results_returned: "10", 5 results_start: 1, 6 shop: [ 7 { 8 name_kana: "しんじゅく ぜんせきこしつ いざかや とりきち しんじゅくてん", 9 other_memo: "様々なご要望承ります◇チーズフォンデュと個室の肉バル横丁 新宿店◇", 10 name: "鶏吉 新宿店", 11 genre: { 12 name: "居酒屋", 13 catch: "歓迎会 送別会 新宿 肉バル 個室 女子会", 14 code: "G001" 15 }, 16 open: "月~木、日: 17:00~翌0:00 (料理L.O. 23:00 ドリンクL.O. 23:30)金、祝前日: 17:00~翌3:30 (料理L.O. 翌2:30 ドリンクL.O. 翌3:00)土: 16:00~翌3:30 (料理L.O. 翌2:30 ドリンクL.O. 翌3:00)祝日: 16:00~翌0:00 (料理L.O. 23:00 ドリンクL.O. 23:30)", 17 close: "無休 休日や週末でも使えるお得なクーポン有♪◇新宿 全席個室 居酒屋 鶏吉 新宿店◇【新宿 居酒屋 宴会 個室】【肉バル 個室】", 18 service_area: { 19 name: "東京", 20 code: "SA11" 21 }, 22 station_name: "新宿", 23 }, 24 {(別の飲食店情報)}, 25 {(別の飲食店情報)}, 26 {(別の飲食店情報)}, 27 ], 28} 29}
(上記jsonデータは内容を一部省略したものです。)
エラー
①で、Fatal error: Index out of range
が発生します。
やったこと
そもそもデータが取得できていないのではと思い、
②、③、④の位置でprint(self.restaurants)
を書いてみたところ、
③ではデコードされたデータを出力でき、print(self.restaurants[0].results.shop[0].name)
で店名までアクセスできました。
しかし、②、④では[]
とのみ出力され、データは出力されませんでした。
なぜ、②、④ではデータが出力されず、また、上記エラーが発生しているのかがわかりませんでした。
解決方法をお教えいただけますと幸いです。
補足情報
- Xcode Version 11.2
- Apple Swift version 5.1
- macOS catalina version 10.15.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/09 14:03
2019/11/09 23:15