web-dev-qa-db-fra.com

Les instructions #if DEBUG sont-elles vraiment nécessaires pour les aperçus dans SwiftUI afin de les supprimer dans une build de version?

Les macros du préprocesseur sont assez courantes dans les tutoriels/vidéos officiels de SwiftUI, par exemple:

#if DEBUG
struct ContentView_Previews : PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
#endif

Sont-ils nécessaires? Le compilateur peut sûrement voir que le struct n'est pas utilisé en interne et omettre l'ensemble struct puisque le modificateur d'accès est implicite internal non? Je pense que tout ce qui est conforme à PreviewProvider peut être supprimé, mais ce n'est peut-être pas le cas pour chaque objet conforme, mais s'il n'est pas utilisé, pourquoi Apple = décide d'inclure les macros de préprocesseur?

J'ai essayé de l'exécuter en mode édition et de localiser la classe compilée dans le dossier de données dérivées, mais je n'y comprends rien (fichier .o). Quelqu'un peut-il confirmer si nous devons vraiment inclure les macros pour omettre le code inutilisé (le type ContentView_Previews n'est utilisé nulle part dans le code, attendez-vous à un aperçu qui n'est pas utilisé de toute façon dans la version)) dans la version ?

10
J. Doe

Il semble avoir été supprimé de la 11 GM Seed. Les notes de publication GM seed disent (sous Problèmes résolus):

"Les conditions du compilateur # if/# endif entourant les types PreviewProvider ont été supprimées des modèles SwiftUI. Les PreviewProviders ne sont pas correctement supprimés des produits créés lors de leur archivage. (51539802)"

Je ne sais pas si cela signifie que les fournisseurs de prévisualisation ne sont pas actuellement supprimés ou qu'ils ont résolu le problème et les suppriment maintenant. Je suppose que si le code du modèle supprime le #si cela signifie Apple pense qu'il n'est plus nécessaire.

4
GilroyKilroy

Xcode 11.2 et supérieur n'ont pas besoin du #if DEBUG donc, vous feriez ce qui suit et supprimez le #if DEBUG autour du PreviewProvider

struct ContentView: View {
    var body: some View {
        NavigationView {
            List {
                Text("First Row")
                Text("First Row")
                Text("First Row")
                Text("First Row")
            }.navigationBarTitle(Text("Dynamic List"))
        }
    }

}



struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
2
Arunabh Das

[~ # ~] note [~ # ~] : Pour être très clair, vous NE FAITES PAS devez envelopper vos fournisseurs d'aperçu dans #if DEBUG conditionnelles. Ils sont supprimés de votre build de production.

Je suis un peu en retard, mais je devais juste en prendre note car la confusion est partout sur le web et cela s'avère assez comique. La note de publication se trouvait sous " Problèmes résolus " et le titre du ticket résolu était " PreviewProviders ne sont pas correctement supprimés des produits créés lorsque archivé. (51539802) ".

Oui, tout cela a du sens maintenant.

L'alambicLa preuve

Annnd juste au cas où vous pensez qu'ils pourraient l'avoir changé plus tard ..... plus de preuves

(je suis minutieux ... peut-être trop)

0
Dave Arel

Vous n'avez pas besoin de supprimer cela. DEBUG est un indicateur personnalisé qui est ajouté automatiquement à Your Target -> Build Settings -> Active compilation Conditions. Cet indicateur existe uniquement pour la configuration de débogage, pour la version de version, vous utiliserez la configuration de version qui n'a pas cet indicateur.

Si le drapeau n'existe pas - le code sera omis

Lire la suite ici dans la section "La macro du préprocesseur DEBUG"

0
DenFav