Update 30/01/19
Während diese Antwort möglicherweise funktioniert, besteht die empfohlene Lösung für eine statische Überprüfung (wie von mehreren Apple-Ingenieuren geklärt) darin, ein benutzerdefiniertes Compiler-Flag für iOS-Simulatoren zu definieren. Ausführliche Anweisungen dazu finden Sie in der Antwort von @ mbelsky .
Ursprüngliche Antwort
Wenn Sie eine statische Überprüfung benötigen (z. B. keine Laufzeit, wenn / sonst), können Sie den Simulator nicht direkt erkennen, aber Sie können iOS auf einer Desktop-Architektur wie folgt erkennen
#if (arch(i386) || arch(x86_64)) && os(iOS)
...
#endif
Nach Swift 4.1 Version
Die letzte Verwendung, jetzt direkt für alle in einer Bedingung für alle Arten von Simulatoren, muss nur eine Bedingung anwenden -
#if targetEnvironment(simulator)
// your simulator code
#else
// your real device code
#endif
Weitere Informationen finden Sie im Swift- Vorschlag SE-0190
Für ältere Version -
Dies ist auf einem Gerät eindeutig falsch, gibt jedoch für den iOS-Simulator den Wert true zurück, wie in der Dokumentation angegeben :
Die arch (i386) Build-Konfiguration gibt true zurück, wenn der Code für den 32-Bit-iOS-Simulator kompiliert wird.
Wenn Sie für einen anderen Simulator als iOS entwickeln, können Sie einfach den os
Parameter variieren : z
Erkennen Sie den watchOS- Simulator
#if (arch(i386) || arch(x86_64)) && os(watchOS)
...
#endif
Erkennen Sie den tvOS- Simulator
#if (arch(i386) || arch(x86_64)) && os(tvOS)
...
#endif
Oder erkennen Sie sogar einen Simulator
#if (arch(i386) || arch(x86_64)) && (os(iOS) || os(watchOS) || os(tvOS))
...
#endif
Wenn Sie stattdessen mit einer Laufzeitprüfung einverstanden sind, können Sie die TARGET_OS_SIMULATOR
Variable (oder TARGET_IPHONE_SIMULATOR
in iOS 8 und niedriger) überprüfen, was auf einem Simulator der Fall ist.
Bitte beachten Sie, dass dies anders und etwas eingeschränkter ist als die Verwendung eines Präprozessor-Flags. Zum Beispiel können Sie es nicht an Orten verwenden, an denen a if/else
syntaktisch ungültig ist (z. B. außerhalb von Funktionsbereichen).
Angenommen, Sie möchten unterschiedliche Importe auf dem Gerät und im Simulator durchführen. Dies ist bei einer dynamischen Prüfung unmöglich, während es bei einer statischen Prüfung trivial ist.
#if (arch(i386) || arch(x86_64)) && os(iOS)
import Foo
#else
import Bar
#endif
Da das Flag durch den schnellen Präprozessor durch ein 0
oder ein ersetzt 1
wird, gibt if/else
der Compiler eine Warnung vor nicht erreichbarem Code aus , wenn Sie es direkt in einem Ausdruck verwenden.
Um diese Warnung zu umgehen, lesen Sie eine der anderen Antworten.