根据TargetConditionals.h(似乎,截至 2020 年;任何平台)中的文档:
+---------------------------------------------------------------------+
| TARGET_OS_MAC |
| +---+ +-----------------------------------------------+ +---------+ |
| | | | TARGET_OS_IPHONE | | | |
| | | | +---------------+ +----+ +-------+ +--------+ | | | |
| | | | | IOS | | | | | | | | | | |
| |OSX| | |+-------------+| | TV | | WATCH | | BRIDGE | | |DRIVERKIT| |
| | | | || MACCATALYST || | | | | | | | | | |
| | | | |+-------------+| | | | | | | | | | |
| | | | +---------------+ +----+ +-------+ +--------+ | | | |
| +---+ +-----------------------------------------------+ +---------+ |
+---------------------------------------------------------------------+
这告诉我们:
⚠️但是等等!⚠️
我是从 iOS 14(macOS 11、watchOS 7)SDK 中得到的。如果我回顾 iOS 13(macOS 10.15,watchOS 6)SDK,我会看到:
+----------------------------------------------------------------+
| TARGET_OS_MAC |
| +---+ +-----------------------------------------------------+ |
| | | | TARGET_OS_IPHONE | |
| |OSX| | +-----+ +----+ +-------+ +--------+ +-------------+ | |
| | | | | IOS | | TV | | WATCH | | BRIDGE | | MACCATALYST | | |
| | | | +-----+ +----+ +-------+ +--------+ +-------------+ | |
| +---+ +-----------------------------------------------------+ |
+----------------------------------------------------------------+
值得注意的是,TARGET_OS_DRIVERKIT它是 14 年的新产品,现在TARGET_OS_MACCATALYST在里面IOS。这告诉我,针对 iOS 14 SDK 进行编译可能会破坏为 iOS 13 编写的一些 C 代码,如果它假设TARGET_OS_MACCATALYST并且IOS完全独立的话。
此外,还定义了这些:
TARGET_OS_SIMULATOR仅适用于iOS、tvOS 和 watchOS 模拟器。您可以使用上述#defines进一步细化它
TARGET_OS_WIN32以防您想使用 Apple 的 SDK 来制作 Windows 应用程序。除了 Apple 自己的(如 iTunes、Safari 和 QuickTime),我个人不知道其他任何东西。如果您想随身携带现有的 Objective-C 代码,现在 Swift 支持 Windows,这可能会变得有用。
TARGET_OS_UNIX适用于非 Apple UNIX 系统
这些已被弃用,不应再使用。也就是说,您可能会在必须维护的代码中找到它们,因此它们的含义如下:
TARGET_IPHONE_SIMULATOR以前是指iPhoneOS模拟器
TARGET_OS_EMBEDDED用于表示 iOS、tvOS 和 watchOS 非模拟设备
TARGET_OS_NANO可能曾经是指 iPod Nano(我在网上找不到任何历史用法)
还有一点需要注意的是,在TargetConditionals.hswift-corelibs-foundation中使用的是显着不同的,包括#define用于 Android、Cygwin 和其他未明确支持但技术上可以工作的平台的 s。
我不完全确定该怎么做。我猜这是为了编译 Swift Foundation 框架,而不是为了使用它,因为 Swift 不使用#defines。