質問するログイン新規登録
データバインディング

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

Q&A

0回答

244閲覧

Swift UI 画面遷移で受け渡した値をクラスの引数にするとエラーが発生する

jun9

総合スコア23

データバインディング

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

0グッド

0クリップ

投稿2023/02/04 15:36

編集2023/02/04 15:37

0

0

実現したいこと

画面遷移によって遷移先に受け渡した値を遷移先Viewでクラスの引数に指定したい。

前提

現在、画面遷移によって遷移先に受け渡した値を遷移先Viewでクラスの引数に指定しようとしておりますが、エラーが発生しております。

TopView()からContentView()に値(id)の受け渡しをし、ContentView()でCreatedDataクラスの引数に指定することで、最終的にCreatedDataクラス内でその値を使用できるようにしたいと考えております。

発生している問題・エラーメッセージ

ソースコード18行目にて、下記エラーメッセージが発生しました。 Cannot use instance member 'id' within property initializer; property initializers run before 'self' is available

該当のソースコード

swift

1struct TopView: View{ 2 var routes: [Route] = routeData 3 var body: some View { 4 NavigationView { 5 List { 6 ForEach(0 ..< routes.count ,id: \.self) { index in 7 NavigationLink(destination: ContentView(id: routes[index].note)){ 8 Text(routes[index].title) 9 } 10 } 11 } 12 } 13 } 14} 15 16struct ContentView: View { 17 var id :String 18 @ObservedObject private var fetcher = CreatedData(id: id) //Cannot use instance member 'id' within property initializer; property initializers run before 'self' is available 19 var body: some View { 20 Text(String(id)) //変数idの値は受け渡されていることを確認。 21 } 22} 23 24class CreatedData: ObservableObject { 25 var id: String 26 init(id: String) { 27 self.id = id 28 } 29 //処理 30} 31 32

試したこと

エラーを確認しましたところ、ContentView内にinitメソッドを追加しなければならないとの意味と理解しましたが、ContentView内の変数idはTopView()からNavigationLinkで受け渡された値であり、initメソッドを使うのはおかしいと考えております。

このエラーが発生する原因がわかる方がいらっしゃいましたら、アドバイスを頂けますと幸いです。

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

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

hoshi-takanori

2023/02/04 17:21

SwiftUI は Swift の言語仕様を知らないと難しい面がありますね…。
jun9

2023/02/05 06:35

takanori さん、コメントありがとうございます。私は以前JavaScriptしか触っていなかったのでswiftの仕様が分かりきっておらず難しいですね。。。1度angular jsで作ったアプリをswiftで作り直しているんですが、なかなかうまくいかないですね。画面遷移時にclassにURLの末尾をデータバインドして非同期通信でページ毎に違うデータを取得しようとしているんですが、何かいい方法はないでしょうか?
hoshi-takanori

2023/02/05 08:50

JavaScript は型に関しては緩い言語ですが、Swift は厳格なので、慣れるまでは大変でしょうね。 とりあえず ContentView の中身を次のようにすればコンパイルは通る気がしますが…。 @ObservedObject private var fetcher: CreatedData init(id: String) { fetcher = CreatedData(id: id) }
jun9

2023/02/06 13:22

takanori さんありがとうございます。上記のようにすれば、コンパイルは通りました。驚きです。 ContentView内にclassにidを渡せるようなイニシャライザを記載されたのは分かったのですが、 var fetcher: CreatedDataとされているのは、どのような仕組みなのでしょうか。変数の型名にclass名を使用出来るのでしょうか?専門書を読んでもネットで調べても同じような例が見つからないです…。
hoshi-takanori

2023/02/06 16:56

var fetcher: CreatedData というのは、fetcher というプロパティ (インスタンス変数とも言う) の型が CreatedData (のオブジェクト) って意味です。クラスや構造体は型なので。
jun9

2023/02/08 13:04

ありがとうございます。クラスや構造体も型なのですね。ベストアンサーを差し上げたいのですが、どのようにすれば良いでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問