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?

93voto

Jakub Truhlář Punkte 18280

Xcode 8 und höher

Verwenden Sie die Aktive Kompilierungsbedingungen-Einstellung unter Build-Einstellungen / Swift Compiler - Benutzerdefinierte Flags.

  • Dies ist die neue Build-Einstellung zum Übergeben von bedingten Kompilierungsflags an den Swift-Compiler.
  • Fügen Sie ganz einfach Flags wie folgt hinzu: ALPHA, BETA usw.

Überprüfen Sie es dann mit Kompilierungsbedingungen wie folgt:

#if ALPHA
    //
#elseif BETA
    //
Else
    //
#endif

Tipp: Sie können auch #if !ALPHA usw. verwenden.

81voto

rickster Punkte 121640

Es gibt keinen Swift-Präprozessor. (Unter anderem führt beliebiger Codeersatz zu Typ- und Speichersicherheitsproblemen.)

Swift enthält jedoch Build-Zeit-Konfigurationsoptionen, so dass Sie bedingt Code für bestimmte Plattformen oder Build-Stile oder als Antwort auf von Ihnen mit -D Compilerargumenten definierte Flags einbeziehen können. Anders als bei C muss ein bedingt kompilierter Abschnitt Ihres Codes jedoch syntaktisch vollständig sein. Hierzu gibt es einen Abschnitt in Verwenden von Swift mit Cocoa und Objective-C.

Zum Beispiel:

#if os(iOS)
    let color = UIColor.redColor()
#else
    let color = NSColor.redColor()
#endif

58voto

Jon Willis Punkte 6908

IsDebug-Konstante basierend auf aktiven Kompilierungsbedingungen

Ein weiterer, vielleicht einfacherer Lösungsansatz, der dennoch zu einem booleschen Wert führt, den Sie an Funktionen übergeben können, ohne überall in Ihrem Code #if-Bedingungen zu verwenden, besteht darin, DEBUG als eine Ihrer Projektbuild-Ziel Aktive Kompilierungsbedingungen festzulegen und das folgende hinzuzufügen (ich definiere es als eine globale Konstante):

#if DEBUG
    let isDebug = true
#else
    let isDebug = false
#endif

isDebug-Konstante basierend auf Compiler-Optimierungseinstellungen

Dieses Konzept basiert auf kennytms Antwort

Der Hauptvorteil im Vergleich zu kennytms ist, dass hierbei keine privaten oder nicht dokumentierten Methoden verwendet werden.

In Swift 4:

let isDebug: Bool = {
    var isDebug = false
    // Funktion mit einem Nebeneffekt und einem booleschen Rückgabewert, den wir an assert() übergeben können
    func set(debug: Bool) -> Bool {
        isDebug = debug
        return isDebug
    }
    // assert:
    // "Die Bedingung wird nur in Playgrounds und -Onone-Builds ausgewertet."
    // daher wird isDebug in Release-Builds nie auf true geändert
    assert(set(debug: true))
    return isDebug
}()

Verglichen mit Präprozessor-Makros und kennytms Antwort,

  • Sie müssen kein benutzerdefiniertes -D DEBUG flag definieren, um es zu verwenden

  • ~ Es ist tatsächlich in Bezug auf Optimierungseinstellungen definiert, nicht Xcode-Buildkonfiguration

  • Dokumentiert, was bedeutet, dass die Funktion normalen API-Veröffentlichungs-/Veraltungsmodellen folgen wird.

  • Es wird bei der Verwendung von if/else keine "Wird nie ausgeführt werden" Warnung generiert.

52voto

ingconti Punkte 9854

Meine persönlichen Gedanken zu Xcode 8:

a) Ein benutzerdefinierter Flag mit dem -D Präfix funktioniert gut, aber...

b) Einfachere Verwendung:

In Xcode 8 gibt es einen neuen Abschnitt: "Aktive Kompilierungsbedingungen", bereits mit zwei Zeilen, für Debug und Release.

Fügen Sie einfach Ihr Define OHNE das -D hinzu.

50voto

Sazzad Hissain Khan Punkte 33230

Moignans Antwort funktioniert hier gut. Hier ist ein weiteres Stück Information, falls es hilft,

#if DEBUG
    let a = 2
#else
    let a = 3
#endif

Sie können die Makros wie folgt negieren,

#if !RELEASE
    let a = 2
#else
    let a = 3
#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