Perbarui 30/01/19
Meskipun jawaban ini dapat berfungsi, solusi yang disarankan untuk pemeriksaan statis (seperti yang diklarifikasi oleh beberapa insinyur Apple) adalah dengan menentukan flag kompiler khusus yang menargetkan iOS Simulators. Untuk instruksi terperinci tentang bagaimana melakukannya, lihat jawaban @ mbelsky .
Jawaban asli
Jika Anda memerlukan pemeriksaan statis (mis. Bukan runtime jika / selain itu) Anda tidak dapat mendeteksi simulator secara langsung, tetapi Anda dapat mendeteksi iOS pada arsitektur desktop seperti berikut
#if (arch(i386) || arch(x86_64)) && os(iOS)
...
#endif
Setelah versi Swift 4.1
Penggunaan terbaru, sekarang langsung untuk semua dalam satu kondisi untuk semua jenis simulator hanya perlu menerapkan satu kondisi -
#if targetEnvironment(simulator)
// your simulator code
#else
// your real device code
#endif
Untuk klarifikasi lebih lanjut, Anda dapat memeriksa proposal Swift SE-0190
Untuk versi yang lebih lama -
Jelas, ini salah pada perangkat, tetapi mengembalikan true untuk iOS Simulator, seperti yang ditentukan dalam dokumentasi :
Konfigurasi pembangunan lengkungan (i386) mengembalikan true ketika kode dikompilasi untuk simulator iOS 32-bit.
Jika Anda mengembangkan untuk simulator selain iOS, Anda dapat dengan mudah memvariasikan os
parameter: mis
Deteksi simulator watchOS
#if (arch(i386) || arch(x86_64)) && os(watchOS)
...
#endif
Deteksi simulator tvOS
#if (arch(i386) || arch(x86_64)) && os(tvOS)
...
#endif
Atau, bahkan, mendeteksi simulator apa pun
#if (arch(i386) || arch(x86_64)) && (os(iOS) || os(watchOS) || os(tvOS))
...
#endif
Jika Anda tidak keberatan dengan pemeriksaan runtime, Anda dapat memeriksa TARGET_OS_SIMULATOR
variabel (atau TARGET_IPHONE_SIMULATOR
di iOS 8 dan di bawah), yang benar pada simulator.
Harap perhatikan bahwa ini berbeda dan sedikit lebih terbatas daripada menggunakan bendera preprosesor. Misalnya Anda tidak akan dapat menggunakannya di tempat di mana if/else
sintaksis tidak valid (misalnya di luar cakupan fungsi).
Katakan, misalnya, bahwa Anda ingin memiliki impor yang berbeda pada perangkat dan pada simulator. Ini tidak mungkin dengan pemeriksaan dinamis, sedangkan itu sepele dengan pemeriksaan statis.
#if (arch(i386) || arch(x86_64)) && os(iOS)
import Foo
#else
import Bar
#endif
Juga, karena flag diganti dengan a 0
atau a 1
oleh preprocessor cepat, jika Anda langsung menggunakannya dalam if/else
ekspresi kompiler akan memunculkan peringatan tentang kode yang tidak terjangkau.
Untuk mengatasi peringatan ini, lihat salah satu jawaban lainnya.