SwiftUIでXcodeコンソールにprint()するにはどうすればいいですか?質問する

SwiftUIでXcodeコンソールにprint()するにはどうすればいいですか?質問する

そこで、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"))            
    }
}

コンパイラエラーが出力されます:Xcode コンパイラ エラー

では、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。つまり、特定の時間にこれらのクロージャが呼び出されることに依存してはいけません。

おすすめ記事