Güncelleme 30/01/19
Bu yanıt işe yarasa da, statik bir kontrol için önerilen çözüm (birkaç Apple mühendisi tarafından açıklandığı gibi) iOS Simülatörlerini hedefleyen özel bir derleyici bayrağı tanımlamaktır. Bunun nasıl yapılacağı hakkında ayrıntılı talimatlar için @ mbelsky'nin cevabına bakın .
Orijinal cevap
Statik bir kontrole ihtiyacınız varsa (örneğin / else ise bir çalışma zamanı değil) simülatörü doğrudan algılayamazsınız, ancak iOS'u aşağıdaki gibi bir masaüstü mimarisinde tespit edebilirsiniz.
#if (arch(i386) || arch(x86_64)) && os(iOS)
...
#endif
Swift 4.1 sürümünden sonra
Son kullanım, şimdi doğrudan herkes için tek bir koşulda tüm simülatörler için sadece bir koşul uygulamak gerekir -
#if targetEnvironment(simulator)
// your simulator code
#else
// your real device code
#endif
Daha fazla açıklama için Swift teklifini SE-0190 kontrol edebilirsiniz.
Eski sürüm için -
Açıkçası, bu bir cihazda yanlıştır, ancak belgelerde belirtildiği gibi iOS Simülatörü için doğrudur :
Arch (i386) derleme yapılandırması, kod 32 bit iOS simülatörü için derlendiğinde true değerini döndürür.
İOS dışında bir simülatör için geliştiriyorsanız, os
parametreyi değiştirebilirsiniz: ör.
WatchOS simülatörünü algılama
#if (arch(i386) || arch(x86_64)) && os(watchOS)
...
#endif
TVOS simülatörünü algılama
#if (arch(i386) || arch(x86_64)) && os(tvOS)
...
#endif
Veya herhangi bir simülatörü tespit edin
#if (arch(i386) || arch(x86_64)) && (os(iOS) || os(watchOS) || os(tvOS))
...
#endif
Bunun yerine bir çalışma zamanı denetimi ile sorun yaşıyorsanız, bir simülatörde doğru olan TARGET_OS_SIMULATOR
değişkeni (veya TARGET_IPHONE_SIMULATOR
iOS 8 ve aşağısında) inceleyebilirsiniz.
Bunun bir önişlemci bayrağı kullanmaktan farklı ve biraz daha sınırlı olduğunu lütfen unutmayın. Örneğin if/else
a'yı sözdizimsel olarak geçersiz olduğu yerde kullanamazsınız (örneğin işlev kapsamlarının dışında).
Örneğin, cihazda ve simülatörde farklı ithalatlar yapmak istediğinizi varsayalım. Bu, dinamik bir kontrol ile imkansızdır, oysa statik bir kontrol ile önemsizdir.
#if (arch(i386) || arch(x86_64)) && os(iOS)
import Foo
#else
import Bar
#endif
Ayrıca, bayrak bir 0
1
hızlı önişlemci tarafından veya a , doğrudan bir if/else
ifadede kullanırsanız, derleyici ulaşılamaz kod hakkında bir uyarı verecektir.
Bu uyarıya geçici bir çözüm bulmak için diğer yanıtlardan birine bakın.