そこで、SwiftUI ビューでデバッグ中に print ステートメントを配置してみました。
print("landmark: \(landmark)")
以下の本文で。
var body: some View {
NavigationView {
List {
Toggle(isOn: $userData.showFavoritesOnly) {
Text("Favorite only")
}
ForEach(landmarkData) { landmark in
print("landmark: \(landmark)")
if !self.userData.showFavoritesOnly || landmark.isFavorite {
NavigationButton(destination: LandmarkDetail(landmark: landmark)) {
LandmarkRow(landmark: landmark)
}
}
}
}
.navigationBarTitle(Text("Landmarks"))
}
}
では、SwiftUI でコンソールに印刷する適切な方法は何でしょうか?
編集:ランドマークをカスタム文字列変換可能:
struct Landmark: Hashable, Codable, Identifiable, CustomStringConvertible {
var description: String { name+"\(id)" }
var id: Int
var name: String
.....
まだ「文字列はいずれにも変換できません」というエラーが表示されます。これで動作するはずですか?
ベストアンサー1
戻り値をワイルドカードに格納するだけで、関数ビルダー内のどこにでも print ステートメントを簡単に追加でき、実質的に無視することができます。
let _ = print("hi!")
セットアップやその他の冗長性は必要ありません。
通常の方法はprint()
機能しないのに、なぜこれが機能するのでしょうか?
SwiftUI @ViewBuilder
(および一般的な結果ビルダー) では、クロージャ内の他の方法では使用されない値 (たとえば、42
独自の行に がある場合) をすべて消費します。print
関数はVoid
(nothing) を返しますが、ビルダーはこれをビューに組み込む必要があるため、失敗します。代わりにそれを変数 (この場合は_
、基本的にアクセスできない変数) に割り当てることで、 はVoid
そもそもビュー ビルダーに提供されません。
ビルダーは単にVoid
値を受け入れて無視するべきだと主張することもできますが、ビルダーのクロージャには副作用があってはならない (デバッグが終了したらステートメントも削除します) という考え方ですprint
。つまり、特定の時間にこれらのクロージャが呼び出されることに依存してはいけません。