前提
現在Swift UIで遷移ページごとにWeb APIで異なるURLを取得するコードを記述しております。
実現したいこと
①TopView{}でURLを含めたデータ route を用意し、RouteView{}にデータを渡し、
②RouteView{}→にContentView{}に画面遷移する際にNavigationLinkでURLデータを渡し、
③さらにContentView{}から非同期通信でデータを取得するクラス RouteFetcherにURLデータを渡したいと考えています。
発生している問題・エラーメッセージ
ソースコードSwift(1) 28行目にて、
Cannot use instance member 'routedata' within property initializer; property initializers run before 'self' is available
同43行目にて、
Cannot use instance member 'routedata' within property initializer; property initializers run before 'self' is available
のエラーメッセージが表示されます。
Swift(1)
1struct TopView: View{ 2 let route: [Route] = routeData 3 var body: some View { 4 NavigationView { 5 List { 6 ForEach(0 ..< route.count ,id: \.self) { index in 7 RouteView(routedata: route[index]) 8 } 9 } 10 } 11 } 12} 13 14struct RouteView: View { 15 let routedata: Route 16 var body: some View { 17 HStack{ 18 NavigationLink(destination: ContentView(routedata: routedata)) { 19 Text(routedata.title) 20 } 21 } 22 } 23} 24 25//非同期通信で取得したデータを表示 26struct ContentView: View { 27 var routedata: Route 28 @ObservedObject private var fetcher = RouteFetcher(routedata: routedata)//Cannot use instance member 'routedata' within property initializer; property initializers run before 'self' is available 29 var body: some View { 30 //処理 31 } 32} 33 34class RouteFetcher: ObservableObject { 35 var routedata: Route 36 37 init(routedata: Route) { 38 self.routedata = routedata 39 fetchRouteData() 40 } 41 42 let urlLink2 = 43 "https://api-public.odpt.org/api/v4/odpt:BusroutePattern?odpt:operator=odpt.Operator:Toei&odpt:note=\(routeData.note)" //Cannot use instance member 'routedata' within property initializer; property initializers run before 'self' is available 44 45 func fetchRouteData() { 46 URLSession.shared.dataTask(with: URL(string: urlLink2)!) { (data, response, error) in 47 guard let data = data else { return } 48 let decoder: JSONDecoder = JSONDecoder() 49 do { 50 let searchedResultData = try decoder.decode(Array<PoleData>.self, from: data) 51 DispatchQueue.main.async { 52 self.eventData2 = searchedResultData 53 } 54 } catch { 55 print("json convert failed in JSONDecoder. " + error.localizedDescription) 56 } 57 }.resume() 58 } 59}
Swift(2)
1import Foundation 2 3let routeData: [Route] 4 = [Route(id: 0, 5 title: "RH01", 6 destination: "渋谷駅前 - 六本木ヒルズ", 7 note: "%EF%BC%B2%EF%BC%A8%EF%BC%90%EF%BC%91%3A%E6%B8%8B%E8%B0%B7%E9%A7%85%E5%89%8D%E2%86%92%E5%85%AD%E6%9C%AC%E6%9C%A8%E3%83%92%E3%83%AB%E3%82%BA%3A8403%3A1%2C%EF%BC%B2%EF%BC%A8%EF%BC%90%EF%BC%91%3A%E5%85%AD%E6%9C%AC%E6%9C%A8%E3%83%92%E3%83%AB%E3%82%BA%E2%86%92%E6%B8%8B%E8%B0%B7%E9%A7%85%E5%89%8D%3A8403%3A2", 8 busroute: "odpt.Busroute:Toei.RH01"), 9 Route(id: 1, 10 title: "市01", 11 destination: "新橋駅前 - 豊洲市場", 12 note: "%E5%B8%82%EF%BC%90%EF%BC%91%3A%E6%96%B0%E6%A9%8B%E9%A7%85%E5%89%8D%E2%86%92%E8%B1%8A%E6%B4%B2%E5%B8%82%E5%A0%B4%3A107%3A1%2C%E5%B8%82%EF%BC%90%EF%BC%91%3A%E8%B1%8A%E6%B4%B2%E5%B8%82%E5%A0%B4%E2%86%92%E6%96%B0%E6%A9%8B%E9%A7%85%E5%89%8D%3A107%3A2", 13 busroute: "odpt.Busroute:Toei.Ichi01"), 14 Route(id: 2, 15 title: "上01", 16 destination: "東大構内 - 東大構内", 17 note: "%E4%B8%8A%EF%BC%90%EF%BC%91%3A%E6%9D%B1%E5%A4%A7%E6%A7%8B%E5%86%85%E2%86%92%E6%9D%B1%E5%A4%A7%E6%A7%8B%E5%86%85%3A37001%3A3", 18 busroute: "odpt.Busroute:Toei.Ue01") 19 ]
試したこと
RouteFetcherクラスにて、routedataプロパティーの初期化を行ないましたが、エラーが消えない状態となっております。
根本的な理解に誤りがあり、誤ったやり方をしている可能性もありますが、もし、この実現したいことを解決する方法をご存知の方がいらっしゃいましたら、アドバイスをいただけますと幸いです。
どうぞよろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー