अपडेट 30/01/19
हालांकि यह जवाब काम कर सकता है, स्थिर जांच के लिए अनुशंसित समाधान (जैसा कि कई Apple इंजीनियरों द्वारा स्पष्ट किया गया है) iOS सिमलेटर को लक्षित करने वाले एक कस्टम कंपाइलर ध्वज को परिभाषित करना है। यह कैसे करना है पर विस्तृत निर्देशों के लिए, @ mbelsky का उत्तर देखें ।
मूल उत्तर
यदि आपको एक स्थिर जांच की आवश्यकता है (जैसे कि रनटाइम नहीं तो / और) आप सीधे सिम्युलेटर का पता नहीं लगा सकते हैं, लेकिन आप एक डेस्कटॉप आर्किटेक्चर पर आईओएस का पता लगा सकते हैं जैसे कि
#if (arch(i386) || arch(x86_64)) && os(iOS)
...
#endif
स्विफ्ट 4.1 संस्करण के बाद
नवीनतम उपयोग, अब सभी प्रकार के सिमुलेटर के लिए सीधे एक ही स्थिति में सभी को केवल एक शर्त लागू करने की आवश्यकता है -
#if targetEnvironment(simulator)
// your simulator code
#else
// your real device code
#endif
अधिक स्पष्टीकरण के लिए, आप स्विफ्ट प्रस्ताव SE-0190 की जांच कर सकते हैं
पुराने संस्करण के लिए -
स्पष्ट रूप से, यह एक डिवाइस पर गलत है, लेकिन यह iOS सिम्युलेटर के लिए सही है, जैसा कि प्रलेखन में निर्दिष्ट है :
जब 32-बिट iOS सिम्युलेटर के लिए कोड संकलित किया जाता है तो आर्क (i386) कॉन्फ़िगरेशन रिटर्न बनाता है।
यदि आप iOS के अलावा किसी अन्य सिम्युलेटर के लिए विकसित कर रहे हैं, तो आप बस os
पैरामीटर को भिन्न कर सकते हैं : उदा
वॉचओएस सिम्युलेटर का पता लगाएं
#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
जाता है, यदि आप सीधे if/else
अभिव्यक्ति में इसका उपयोग करते हैं तो संकलक अगम्य कोड के बारे में चेतावनी देगा।
इस चेतावनी के आसपास काम करने के लिए, अन्य उत्तरों में से एक देखें।