Aktualizacja 30/01/19
Chociaż ta odpowiedź może zadziałać, zalecanym rozwiązaniem dla kontroli statycznej (wyjaśnione przez kilku inżynierów Apple) jest zdefiniowanie niestandardowej flagi kompilatora ukierunkowanej na symulatory iOS. Aby uzyskać szczegółowe instrukcje, jak to zrobić, zobacz odpowiedź @ mbelsky'ego .
Oryginalna odpowiedź
Jeśli potrzebujesz sprawdzenia statycznego (np. Nie środowiska wykonawczego, jeśli / else), nie możesz bezpośrednio wykryć symulatora, ale możesz wykryć iOS na architekturze pulpitu, jak poniżej
#if (arch(i386) || arch(x86_64)) && os(iOS)
...
#endif
Po wersji Swift 4.1
Najnowsze zastosowanie, teraz bezpośrednio dla wszystkich w jednym stanie dla wszystkich typów symulatorów, musi mieć zastosowanie tylko jeden warunek -
#if targetEnvironment(simulator)
// your simulator code
#else
// your real device code
#endif
Aby uzyskać więcej wyjaśnień, możesz sprawdzić propozycję Swift SE-0190
W przypadku starszej wersji -
Oczywiście jest to fałsz na urządzeniu, ale zwraca wartość true dla symulatora iOS, jak określono w dokumentacji :
Konfiguracja kompilacji arch (i386) zwraca wartość true, gdy kod jest kompilowany dla 32-bitowego symulatora systemu iOS.
Jeśli opracowujesz symulator inny niż iOS, możesz po prostu zmienić os
parametr: np
Wykryj symulator watchOS
#if (arch(i386) || arch(x86_64)) && os(watchOS)
...
#endif
Wykryj symulator tvOS
#if (arch(i386) || arch(x86_64)) && os(tvOS)
...
#endif
Lub nawet wykryj dowolny symulator
#if (arch(i386) || arch(x86_64)) && (os(iOS) || os(watchOS) || os(tvOS))
...
#endif
Jeśli zamiast tego masz rację sprawdzania czasu wykonywania, możesz sprawdzić TARGET_OS_SIMULATOR
zmienną (lub TARGET_IPHONE_SIMULATOR
w iOS 8 i niższych), co jest prawdą w symulatorze.
Zauważ, że jest to inne i nieco bardziej ograniczone niż użycie flagi preprocesora. Na przykład nie będziesz mógł używać go w miejscu, w którym a if/else
jest składniowo niepoprawny (np. Poza zakresem funkcji).
Powiedz na przykład, że chcesz mieć różne importy na urządzeniu i na symulatorze. Jest to niemożliwe przy kontroli dynamicznej, podczas gdy jest trywialne przy kontroli statycznej.
#if (arch(i386) || arch(x86_64)) && os(iOS)
import Foo
#else
import Bar
#endif
Ponadto, ponieważ flaga jest zastąpiona przez a 0
lub a 1
przez szybki preprocesor, jeśli używasz go bezpośrednio wif/else
wyrażeniu, kompilator wyświetli ostrzeżenie o nieosiągalnym kodzie.
Aby obejść to ostrzeżenie, zobacz jedną z pozostałych odpowiedzi.