根据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 模拟器。您可以使用上述#define
s进一步细化它
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.h
swift-corelibs-foundation中使用的是显着不同的,包括#define
用于 Android、Cygwin 和其他未明确支持但技术上可以工作的平台的 s。
我不完全确定该怎么做。我猜这是为了编译 Swift Foundation 框架,而不是为了使用它,因为 Swift 不使用#define
s。