Оновлення 30.01.19
Хоча ця відповідь може працювати, рекомендованим рішенням для статичної перевірки (як уточнили декілька інженерів Apple) є визначення спеціального прапора компілятора, орієнтованого на iOS Simulators. Детальні вказівки, як це зробити, дивіться у відповіді @ mbelsky .
Оригінальна відповідь
Якщо вам потрібна статична перевірка (наприклад, не час виконання, якщо / ще), ви не зможете виявити тренажер безпосередньо, але ви можете виявити 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 Simulator, як зазначено в документації :
Конфігурація побудови арки (i386) повертає істину, коли код компілюється для 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
Крім того, оскільки прапор швидкого препроцесора замінено на a 0або a 1, якщо ви безпосередньо використовуєте його у if/elseвиразі, компілятор підніме попередження про недоступний код.
Щоб вирішити це попередження, дивіться одну з інших відповідей.