Avatar
Avatar
teeeeee
自分も理解できていなかったので今調べてみました。 @StateはdidSetだと全ての変更の際に呼ばれないため、@Stateの変更をトリガーにしたい場合は.onChangeを使うべきのようです。 alertType = .responseErrorではなく、alertType.wrappedValue = responseErrorのようにwrappedValueに直接変更を加えた時、wrappedValueはnonmutating setの値なのでdidSetは呼ばれません。Bindingした値を変更した時もwrappedValueが変更されるので同様です。 ここからは質問の回答とは逸れるのですが、 alertを表示していない時にもalertTypeに値が入っているのは違和感を感じたので、optionalにするかcaseにnoneを入れるのが良いかと思いました。 仮にoptionalにしたとして、今度は、alertが閉じられてshowAlertがfalseになった時にalertTypeをnilにしないといけないためshowAlertの変更を検知しないといけなさそうです。 それは冗長な気がするので、私はBinding時にこう書いてしまった方がわかりやすいと思いました。 Button { alertType = .responseError } label: { Text("アラート表示") } .alert( "alert", isPresented: .init( get: { alertType != nil }, set: { alertType = $0 ? alertType : nil } ), actions: {} ) 他の皆さんのご意見も聞いてみたいです。また、@Stateの解釈に誤りなどがありましたらご指摘いただけますと幸いです。
ご回答ありがとうございます! iOS13をサポートしていますのでonChangeは使えません。。。 .alert( isPresented: .init( get: { alertType != nil }, set: { alertType = $0 ? alertType : nil } ) ) { switch alertType { case .responseError: return Alert(title: Text("responseError", dismissButton: .default(Text("OK"))) case .internetConnectionError: return Alert(title: Text("internetConnectionError", dismissButton: .default(Text("OK"))) default: break } } このように書き換えてみましたが.alertではAlertを返さないといけないためbreakをすると当然ですがMissing return in closure expected to return 'Alert' のエラーになってしまいます。これの回避策があるということでしょうか?理解不足ですみません。。。