実現したいこと
画面遷移によって遷移先に受け渡した値を遷移先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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
SwiftUI は Swift の言語仕様を知らないと難しい面がありますね…。
takanori さん、コメントありがとうございます。私は以前JavaScriptしか触っていなかったのでswiftの仕様が分かりきっておらず難しいですね。。。1度angular jsで作ったアプリをswiftで作り直しているんですが、なかなかうまくいかないですね。画面遷移時にclassにURLの末尾をデータバインドして非同期通信でページ毎に違うデータを取得しようとしているんですが、何かいい方法はないでしょうか?
JavaScript は型に関しては緩い言語ですが、Swift は厳格なので、慣れるまでは大変でしょうね。
とりあえず ContentView の中身を次のようにすればコンパイルは通る気がしますが…。
@ObservedObject private var fetcher: CreatedData
init(id: String) {
fetcher = CreatedData(id: id)
}
takanori さんありがとうございます。上記のようにすれば、コンパイルは通りました。驚きです。
ContentView内にclassにidを渡せるようなイニシャライザを記載されたのは分かったのですが、
var fetcher: CreatedDataとされているのは、どのような仕組みなのでしょうか。変数の型名にclass名を使用出来るのでしょうか?専門書を読んでもネットで調べても同じような例が見つからないです…。
var fetcher: CreatedData というのは、fetcher というプロパティ (インスタンス変数とも言う) の型が CreatedData (のオブジェクト) って意味です。クラスや構造体は型なので。
ありがとうございます。クラスや構造体も型なのですね。ベストアンサーを差し上げたいのですが、どのようにすれば良いでしょうか。

あなたの回答
tips
プレビュー