質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
データバインディング

データソースと、アプリケーションやウェブページ(ウェブアプリケーション)のユーザインタフェースを静的または動的に結合する技術です。

Q&A

0回答

328閲覧

Swift UI NavigationLinkでViewに受け渡した値をclassに受け渡したい

jun9

総合スコア23

データバインディング

データソースと、アプリケーションやウェブページ(ウェブアプリケーション)のユーザインタフェースを静的または動的に結合する技術です。

0グッド

0クリップ

投稿2023/01/14 04:02

編集2023/01/30 10:04

前提

現在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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問