Обновление 30/01/19
Несмотря на то, что этот ответ может работать, рекомендуемое решение для статической проверки (как пояснили несколько инженеров Apple) заключается в определении настраиваемого флага компилятора, предназначенного для симуляторов iOS. Подробные инструкции о том, как это сделать, см. В ответе @ mbelsky .
Оригинальный ответ
Если вам нужна статическая проверка (например, не во время выполнения if / else), вы не можете обнаружить симулятор напрямую, но вы можете обнаружить iOS на настольной архитектуре, как показано ниже
#if (arch(i386) || arch(x86_64)) && os(iOS)
...
#endif
После версии Swift 4.1
Последнее использование, теперь непосредственно для всех в одном условии, для всех типов тренажеров необходимо применять только одно условие -
#if targetEnvironment(simulator)
// your simulator code
#else
// your real device code
#endif
Для получения дополнительной информации вы можете проверить предложение Swift SE-0190
Для старой версии -
Ясно, что это ложно на устройстве, но оно возвращает истину для симулятора iOS, как указано в документации :
Конфигурация сборки arch (i386) возвращает true, когда код компилируется для 32-битного симулятора iOS.
Если вы разрабатываете для симулятора, кроме iOS, вы можете просто изменить os
параметр: например,
Определить симулятор watchOS
#if (arch(i386) || arch(x86_64)) && os(watchOS)
...
#endif
Определить симулятор tvOS
#if (arch(i386) || arch(x86_64)) && os(tvOS)
...
#endif
Или даже обнаружить любой симулятор
#if (arch(i386) || arch(x86_64)) && (os(iOS) || os(watchOS) || os(tvOS))
...
#endif
Если вместо этого вы согласны с проверкой во время выполнения, вы можете проверить TARGET_OS_SIMULATOR
переменную (или TARGET_IPHONE_SIMULATOR
в iOS 8 и ниже), что верно на симуляторе.
Обратите внимание, что это отличается и немного более ограничено, чем использование флага препроцессора. Например, вы не сможете использовать его там, где if/else
синтаксически недопустим (например, за пределами области действия функций).
Скажем, например, что вы хотите иметь разные импорты на устройстве и на симуляторе. Это невозможно при динамической проверке, тогда как при статической проверке это тривиально.
#if (arch(i386) || arch(x86_64)) && os(iOS)
import Foo
#else
import Bar
#endif
Кроме того, поскольку флаг заменяется на 0
или или 1
препроцессором swift, если вы непосредственно используете его в if/else
выражении, компилятор выдаст предупреждение о недоступном коде.
Чтобы обойти это предупреждение, см. Один из других ответов.