J'ai donc essayé de mettre une instruction d'impression lors du débogage dans une vue SwiftUI.
print("landmark: \(landmark)")
Dans le corps suivant.
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"))
}
}
Alors, quelle est la bonne façon d'imprimer sur la console dans SwiftUI?
EDIT: J'ai rendu Landmark conforme à CustomStringConvertible :
struct Landmark: Hashable, Codable, Identifiable, CustomStringConvertible {
var description: String { name+"\(id)" }
var id: Int
var name: String
.....
J'obtiens toujours l'erreur "La chaîne n'est convertible en aucune". Cela devrait-il fonctionner maintenant?
Essayez de cliquer avec le bouton droit sur le bouton de lecture de l'aperçu en direct et de sélectionner 'Aperçu du débogage dans la fenêtre contextuelle
Voici une aide Print( ... )
vue qui agit comme une fonction print( ... )
mais dans une vue
Mettez cela dans l'un de vos fichiers de vue
extension View {
func Print(_ vars: Any...) -> some View {
for v in vars { print(v) }
return EmptyView()
}
}
et utiliser à l'intérieur de body
comme ça
Print("Here I am", varOne, varTwo ...)
ou dans un ForEach {}
comme ça
self.Print("Inside ForEach", varOne, varTwo ...)
Remarque: vous devrez peut-être mettre Print()
dans un Group {}
Lors de la combinaison avec des vues existantes
Vous ne pouvez pas imprimer dans la structure du corps, c'est-à-dire une structure qui est ne certaine vue type.Pour l'impression, vous devez faire fonctionner la structure du corps et l'appeler en utilisant le bouton ou autre chose.
Il est possible d'utiliser print () en se souvenant que tout le contenu de SwiftUI View est (a) des fermetures implicites et (b) il est fortement recommandé de décomposer les vues autant que possible pour avoir une structure simple, donc cela pourrait ressembler à ce qui suit ...
struct Model: Identifiable {
let value: String
var id: String {
value
}
init (_ value: String) {
self.value = value
}
}
struct TestView: View {
@State var showFavoritesOnly = false
@State var listData: [Model] = [Model("one"), Model("two"), Model("three")]
var body: some View {
NavigationView {
List {
Toggle(isOn: $showFavoritesOnly) {
Text("Favorite only")
}
ForEach(listData) { data in
self.rowView(data: data)
}
}
}
}
private func rowView(data: Model) -> some View {
#if DEBUG
print(">> \(data.value)")
#endif
return NavigationLink(destination: Text("Details")) {
Text("Go next from \(data.value)")
}
}
}
... et en cliquant avec le bouton droit dans Aperçu pour sélectionner exécuter comme Aperçu de débogage, nous obtenons:
2019-10-31 14:28:03.467635+0200 Test[65344:11155167] [Agent] Received connection, creating agent
2019-10-31 14:28:04.472314+0200 Test[65344:11155168] [Agent] Received display message
>> one
>> two
>> three
Vous ne pouvez pas parce que vous êtes dans une propriété calculée. Vous avez besoin par exemple d'un bouton et dans l'action vous définissez l'impression. Ou travaillez avec des points d'arrêt