อัปเดต 30/01/19
ในขณะที่คำตอบนี้อาจใช้งานได้โซลูชันที่แนะนำสำหรับการตรวจสอบแบบคงที่ (ตามที่วิศวกรหลายคนอธิบายไว้) คือการกำหนดธงคอมไพเลอร์ที่กำหนดเองซึ่งกำหนดเป้าหมายไปที่ 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 ตามที่ระบุในเอกสารประกอบ :
คอนฟิกูเรชันการบิวด์ arch (i386) จะส่งคืนค่าจริงเมื่อโค้ดถูกคอมไพล์สำหรับเครื่องจำลอง iOS 32 บิต
หากคุณกำลังพัฒนาโปรแกรมจำลองอื่นที่ไม่ใช่ 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 และต่ำกว่า) ซึ่งเป็นความจริงในเครื่องจำลอง
โปรดสังเกตว่าสิ่งนี้แตกต่างและ จำกัด กว่าการใช้แฟล็กตัวประมวลผลก่อนเล็กน้อย ตัวอย่างเช่นคุณจะไม่สามารถใช้งานได้ในสถานที่ที่ a if/else
ไม่ถูกต้องทางไวยากรณ์ (เช่นนอกขอบเขตฟังก์ชั่น)
ตัวอย่างเช่นคุณต้องการให้มีการนำเข้าที่แตกต่างกันบนอุปกรณ์และในเครื่องจำลอง นี่เป็นไปไม่ได้ด้วยการตรวจสอบแบบไดนามิกในขณะที่มันเป็นเรื่องเล็กน้อยกับการตรวจสอบแบบคงที่
#if (arch(i386) || arch(x86_64)) && os(iOS)
import Foo
#else
import Bar
#endif
นอกจากนี้เนื่องจากแฟล็กถูกแทนที่ด้วย a 0
หรือ a 1
โดยตัวประมวลผลก่อน swift หากคุณใช้โดยตรงในif/else
นิพจน์คอมไพเลอร์จะเพิ่มคำเตือนเกี่ยวกับโค้ดที่เข้าไม่ถึง
เพื่อที่จะหลีกเลี่ยงคำเตือนนี้ดูคำตอบอีกข้อหนึ่ง