バッドノウハウです。
通常SwiftUIではbody
の中にprint
を書くことができません。
var body: some View {
let width: CGFloat = 100 + 100
print(width) //エラー
Rectangle()
.frame(width: width)
}
この原因はprint(width)
が実はVoid
の値()
を返していることです。そのため、ViewBuilder
の側がVoid
の値をView
として解釈しようとして、エラーになります。
パッと思いつく解決策としては下のように、body
の外で計算型プロパティを作って内部でprint
を呼ぶ方法でしょうか。もちろんクロージャを即時実行する形でもいいと思います。
var width: CGFloat {
let _width: CGFloat = 100 + 100
print(_width)
return _width
}
var body: some View {
Rectangle()
.frame(width: width)
}
あとはonAppear
内部で
var body: some View {
let width: CGFloat = {
let _width: CGFloat = 100 + 100
print(_width)
return _width
}()
Rectangle()
.frame(width: width)
}
何にせよちょっと面倒ですね。
そこで、let width = 100 + 100
の方に着目します。これは文だから(値を返さないので)エラーになっていません。
そこでこうするとprintデバッグできるようになります。
var body: some View {
let width: CGFloat = 100 + 100
let _ = print(width) //200
Rectangle()
.frame(width: width)
}
得られた値()
を文の中で用いるので、何の問題もなく実行されます。コード量は1行も増えません。
これでSwiftUIでもスマートにprintデバッグできるようになりました!
SwiftUI3ではひっそりとデバッグ用関数が追加されたようです。以下の関数を使うとさらに幸せになれそうです。
let _ = print(Self._printChanges())