Swift: iOS-Bereitstellungsziel Befehlszeilenflag

8

Wie überprüfe ich das iOS-Implementierungsziel in einer Swift-Anweisung zur bedingten Kompilierung?

Ich habe Folgendes versucht:

%Vor%

Aber der erste Ausdruck verursacht den Kompilierungsfehler:

%Vor%     
ma11hew28 23.06.2014, 15:06
quelle

4 Antworten

11

TL; DR? & gt; Gehe zu 3. Lösung

1. Vorverarbeitung in Swift

Gemäß Apple-Dokumentation zu Vorverarbeitungsrichtlinien :

  

Der Swift-Compiler enthält keinen Präprozessor. Stattdessen dauert es   Vorteil der Kompilierzeit Attribute, Build-Konfigurationen und   Sprachfunktionen, um die gleiche Funktionalität zu erreichen. Dafür   Grund, Präprozessordirektiven werden nicht in Swift importiert.

Deshalb haben Sie einen Fehler, wenn Sie versuchen, __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_8_0 zu verwenden, was eine C-Preprocessing-Direktive ist. Mit swift können Sie #if nicht mit Operatoren wie < verwenden. Alles, was Sie tun können, ist:

%Vor%

oder mit Bedingungen:

%Vor%

2. Bedingtes Kompilieren

Nochmals von die gleiche Dokumentation :

  

Build-Konfigurationen umfassen die wörtlichen wahren und falschen Werte,   Befehlszeilenflags und die Plattform-Testfunktionen, die in der   Tabelle unten. Sie können Befehlszeilen-Flags mithilfe von -D & lt; # flag # & gt;.

angeben
  • true und false : Wird uns nicht helfen
  • Plattform-Testfunktionen : os(iOS) oder arch(arm64) & gt; wird dir nicht helfen, suchte ein wenig, kann nicht herausfinden, wo sie definiert sind. (im Compiler selbst vielleicht?)
  • Befehlszeilen-Flags : Hier kommen wir, das ist die einzige Option, die Sie verwenden können ...

3. Lösung

Fühlt sich ein bisschen wie ein Workaround an, aber macht den Job:

Jetzt können Sie zum Beispiel #if iOSVersionMinRequired7 anstelle von __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_7_0 verwenden, vorausgesetzt natürlich, dass Ihr Ziel iOS7 ist.

Das ist im Grunde dasselbe, als wenn Sie Ihre iOS-Implementierungszielversion in Ihrem Projekt ändern, was weniger praktisch ist ... Natürlich können Sie Multiple Build-Konfigurationen mit verwandten Schemata abhängig von Ihren iOS-Versionszielen erstellen.

Apple wird das sicherlich verbessern, vielleicht mit einer eingebauten Funktion wie os() ...

    
Vincent Guerci 24.06.2014 22:30
quelle
6

Getestet in Swift 2.2

Mit Deployment Target meinst du iOS version oder App Target ? Im Folgenden stelle ich die Lösung vor, wenn Sie mehrere Versionen der App haben (kostenlose App, bezahlte App, ...), so dass Sie verschiedene App-Ziele verwenden.

Sie können benutzerdefinierte Build-Konfigurationen festlegen:
1. Gehe zu deinem Projekt / wähle dein Ziel / Build Settings / suche nach Custom Flags
2. Setzen Sie für Ihr gewähltes Ziel Ihr benutzerdefiniertes Flag mit dem Präfix -D (ohne Leerstellen) für Debug- und Release-Dateien 3. Führen Sie die obigen Schritte für jedes Ziel aus, das Sie haben

Um zwischen Zielen zu unterscheiden, können Sie Folgendes tun:

%Vor%     
Andrej 08.04.2016 14:37
quelle
0

Sie können dies in einer bedingten Kompilierungsanweisung nicht tun. "Komplexe Makros", wie Apple sie nennt, werden in Swift nicht unterstützt. Generika und Typen machen das gleiche mit besseren Ergebnissen. (Hier ist ein Link, den sie veröffentlicht haben Ссылка )

Hier ist eine Funktion, die ich entwickelt habe, die dasselbe bewirkt (und natürlich nur die Zeichenfolgen mit dem ersetzen, was für Sie nützlich ist, wie ein boolescher Befehl oder nur die Option selbst):

%Vor%     
Dylan Gattey 23.06.2014 17:47
quelle
0

Ich weiß, dass Ihre Frage schon seit einer Weile hier ist, aber für den Fall, dass jemand noch nach einer Antwort sucht, sollten sie wissen, dass Sie mit Swift 2.0 so etwas tun können:

%Vor%

Sie können mehr darüber hier lesen.

    
Mihai Fratu 28.07.2016 11:40
quelle