Cập nhật 30/01/19
Mặc dù câu trả lời này có thể hoạt động, giải pháp được đề xuất cho kiểm tra tĩnh (được làm rõ bởi một số kỹ sư của Apple) là xác định cờ trình biên dịch tùy chỉnh nhắm mục tiêu Trình mô phỏng iOS. Để biết hướng dẫn chi tiết về cách thực hiện, hãy xem câu trả lời của @ mbelsky .
Câu trả lời gốc
Nếu bạn cần kiểm tra tĩnh (ví dụ: không phải thời gian chạy nếu / khác), bạn không thể phát hiện trực tiếp trình giả lập, nhưng bạn có thể phát hiện iOS trên kiến trúc máy tính để bàn như sau
#if (arch(i386) || arch(x86_64)) && os(iOS)
...
#endif
Sau phiên bản Swift 4.1
Sử dụng mới nhất, bây giờ trực tiếp cho tất cả trong một điều kiện cho tất cả các loại mô phỏng chỉ cần áp dụng một điều kiện -
#if targetEnvironment(simulator)
// your simulator code
#else
// your real device code
#endif
Để làm rõ hơn, bạn có thể kiểm tra đề xuất Swift SE-0190
Đối với phiên bản cũ hơn -
Rõ ràng, điều này là sai trên thiết bị, nhưng nó trả về đúng cho Trình mô phỏng iOS, như được chỉ định trong tài liệu :
Cấu hình xây dựng vòm (i386) trả về đúng khi mã được biên dịch cho trình giả lập iOS 32 bit.
Nếu bạn đang phát triển cho một trình giả lập khác ngoài iOS, bạn chỉ cần thay đổi os
tham số: vd
Phát hiện trình giả lập watchOS
#if (arch(i386) || arch(x86_64)) && os(watchOS)
...
#endif
Phát hiện trình giả lập tvOS
#if (arch(i386) || arch(x86_64)) && os(tvOS)
...
#endif
Hoặc, thậm chí, phát hiện bất kỳ trình giả lập
#if (arch(i386) || arch(x86_64)) && (os(iOS) || os(watchOS) || os(tvOS))
...
#endif
Thay vào đó, nếu bạn ổn với kiểm tra thời gian chạy, bạn có thể kiểm tra TARGET_OS_SIMULATOR
biến (hoặc TARGET_IPHONE_SIMULATOR
trong iOS 8 trở xuống), đó là sự thật trên trình giả lập.
Xin lưu ý rằng điều này khác và hạn chế hơn một chút so với sử dụng cờ tiền xử lý. Chẳng hạn, bạn sẽ không thể sử dụng nó ở nơi mà a if/else
không hợp lệ về mặt cú pháp (ví dụ: bên ngoài phạm vi chức năng).
Ví dụ, giả sử bạn muốn có các bản nhập khác nhau trên thiết bị và trên trình giả lập. Điều này là không thể đối với kiểm tra động, trong khi đó không quan trọng bằng kiểm tra tĩnh.
#if (arch(i386) || arch(x86_64)) && os(iOS)
import Foo
#else
import Bar
#endif
Ngoài ra, do cờ được thay thế bằng a 0
hoặc a 1
bởi bộ tiền xử lý nhanh, nếu bạn trực tiếp sử dụng nó trong một if/else
biểu thức, trình biên dịch sẽ đưa ra cảnh báo về mã không thể truy cập được.
Để khắc phục cảnh báo này, hãy xem một trong những câu trả lời khác.