SwiftUI
環境構築
VSCodeを使う場合はSweetPadが良いらしい
https://zenn.dev/aromarious/articles/sweetpad-extension-introduction
=>
フラッシュしないとprintが出力されない
AVFoundationを使うと謎のC++エラーがでることがある?
JetBrainsのFleetでも使える
SwiftUI vs UIKit
UIKitが元からあったやつでSwiftUIが新しい
リンク集
https://github.com/YusukeHosonuma/Effective-SwiftUI
概要
Viewはstructでbodyという名前の関数がUIのあり方を宣言する
Viewのライフサイクル
Viewを表示する
=> Viewのstateなどが初期化される
Viewのstateが変更される
=> Viewが再描画される
Viewが非表示になる
Viewが握っているstateは未使用になるので破棄される
勘所
Viewはstructでstateを渡すとViewを返す関数のように思うと良い
stateのライフサイクルはそれを宣言したViewに紐づく
いつ再描画するかはどのstateを監視するか(依存するか)によって決まる
メモ
State
Viewが自身の状態としてもつもの
これを子Viewに渡したいときは子View側がBindingで同じ方を持つ
Binding
子Viewが親ViewのStateをBindingしたいときに使う
双方向バインディングなので親も子もread/writeができる
Published
https://developer.apple.com/documentation/combine/published
プロパティに@PublishedをつけるとPublisherを作ってくれる
値ではなくPublisherとして触りたい時はプロパティに$をつける
classに使えるがstructには使えない
ObservableObject
Protocol
@Publishedがパブリッシュする前にobjectWillChangeを発火する
@ObservedObjectをつけるプロパティはObservableObjectである必要がある
今は@Observableを使う方が現代的かもしれん
@ObservedObject
ViewのObservableObjectなパラメータにこれをつけると、パラメータに変更があったときにViewが更新される
StateObjectを子Viewに渡すときに使えば、StateObject更新時に子Viewが更新できる
@StateObject
@EnvironmentObject
https://developer.apple.com/documentation/swiftui/environmentobject
ObservableObject継承クラスをいい感じにViewに注入する仕組み