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 ?
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.
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()
}
}
[~ # ~] 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.
Annnd juste au cas où vous pensez qu'ils pourraient l'avoir changé plus tard ..... plus de preuves
(je suis minutieux ... peut-être trop)
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"