Оновлення 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
виразі, компілятор підніме попередження про недоступний код.
Щоб вирішити це попередження, дивіться одну з інших відповідей.