877 Stimmen

#ifdef Ersatz in der Swift-Sprache

In C/C++/Objective C können Sie mit Compiler-Präprozessoren ein Makro definieren. Außerdem können Sie mit Compiler-Präprozessoren einige Teile des Codes ein- oder ausschließen.

#ifdef DEBUG
    // Nur im Debug-Modus
#endif

Gibt es eine ähnliche Lösung in Swift?

29voto

Vadim Motorine Punkte 2729

In Swift-Projekten, die mit Xcode Version 9.4.1 erstellt wurden, Swift 4.1

#if DEBUG
#endif

funktioniert standardmäßig, da in den Preprocessor-Makros DEBUG=1 bereits von Xcode festgelegt wurde.

Daher können Sie #if DEBUG direkt verwenden.

Übrigens, wie man die bedingten Kompilationsblöcke im Allgemeinen verwendet, ist im Buch von Apple The Swift Programming Language 4.1 (Abschnitt Compiler Control Statements) beschrieben und wie man die Kompilierungsflags schreibt und was das Pendant zu den C-Makros in Swift ist, ist in einem anderen Buch von Apple Using Swift with Cocoa and Objective C (im Abschnitt Preprocessor Directives) beschrieben.

Ich hoffe, dass Apple in Zukunft ausführlichere Inhalte und Stichwortverzeichnisse für ihre Bücher veröffentlichen wird.

25voto

midhun p Punkte 1541

XCODE 9 UND HÖHER

#if DEVELOP
    //print("Develop")
#elseif PRODUCTION
    //print("Production")
#else
    //
#endif

25voto

Mojtaba Hosseini Punkte 68078

Es gibt einige Prozessoren, die ein Argument akzeptieren, und ich habe sie unten aufgelistet. Du kannst das Argument nach Belieben ändern:

#if os(macOS) /* Überprüft das Zielbetriebssystem */

#if canImport(UIKit) /* Überprüft, ob ein Modul vorhanden ist */

#if swift(<5) /* Überprüft die Swift-Version */

#if targetEnvironment(simulator) /* Überprüft Umgebungen wie Simulator oder Catalyst */

#if compiler(<7) /* Überprüft die Compiler-Version */

Du kannst auch benutzerdefinierte Flags wie DEBUG oder andere von dir definierte Flags verwenden

#if DEBUG
print("Debug-Modus")
#endif

8voto

Rivera Punkte 10394

Nachdem Sie in Ihren GCC_PREPROCESSOR_DEFINITIONS Build-Einstellungen DEBUG=1 festgelegt haben, ziehe ich es vor, eine Funktion zu verwenden, um diese Aufrufe zu tätigen:

func executeInProduction(_ block: () -> Void)
{
    #if !DEBUG
        block()
    #endif
}

Und dann einfach jeden Block in diese Funktion einschließen, den ich bei Debug-Builds auslassen möchte:

executeInProduction {
    Fabric.with([Crashlytics.self]) // Der Compiler prüft diese Zeile auch im Debug-Modus
}

Der Vorteil im Vergleich zu:

#if !DEBUG
    Fabric.with([Crashlytics.self]) // Dies wird nicht überprüft, kann in Nicht-Debug-Builds nicht kompilieren
#endif

besteht darin, dass der Compiler die Syntax meines Codes überprüft, sodass ich sicher bin, dass die Syntax korrekt ist und kompiliert wird.

5voto

sachin_kvk Punkte 77

![In Xcode 8 & above go to build setting -> search for custom flags ]1

In code

 #if Live
    print("Live")
    #else
    print("debug")
    #endif

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X