web-dev-qa-db-fra.com

Comment imprimer () sur la console Xcode dans SwiftUI?

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"))            
    }
}

Erreurs du compilateur: Xcode compiler error

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?

20
zumzum

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

23
Philip Martin

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

7
Rok Krulec

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.

2
Monil Gandhi

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
1
Asperi

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

0
jsbeginnerNodeJS