如何将Swift声明标记为在iOS中可用而在macOS中不可用

如何将Swift声明标记为在iOS中可用而在macOS中不可用,swift,Swift,我有一个只在iOS 10.0及以上版本上运行的类。它在一个Swift包中,所以Xcode11也在尝试为macOS编译它,并且抱怨。我怎么说它只在iOS 10.0上可用 这些不起作用: @available(iOS 10.0, *) class Thing { ... } @available(macOS, unavailable) @available(iOS 10.0, *) class Thing { ... } 一些文档: 把它包在这里面 #if canImport(UIKit)

我有一个只在iOS 10.0及以上版本上运行的类。它在一个Swift包中,所以Xcode11也在尝试为macOS编译它,并且抱怨。我怎么说它只在iOS 10.0上可用

这些不起作用:

@available(iOS 10.0, *)
class Thing { ... }

@available(macOS, unavailable)
@available(iOS 10.0, *)
class Thing { ... }
一些文档:

把它包在这里面

#if canImport(UIKit)
    // iOS Only code
#endif
这样,它将从编译后的项目中删除,如果它不在iOS设备上

您也可以检查操作系统类型,如
#if OS(iOS)
,但具体说明您为什么应该关心操作系统?这不是因为一些特别针对iOS的东西,比如
UIKit
?如果没有,请更一般地限制
OS
,如@shreram所述。

来自文档

iOS iOS应用扩展macOS macOS应用扩展watchOS watchOSApplicationExtension tvOS tvOSApplicationExtension swift您 也可以使用星号(*)来表示 上述所有平台名称的声明

所以在@available(ios10.0,*)中,声明可以在所有其他平台上使用。但我们也明确指出,它在macOS中不可用。因此,编译器最终会变得混乱,可用性赢得了这场战争。您可以使用编译器标志,而不是使用@available

#if os(iOS)
#endif

指定编译器仅在iOS上编译代码。

“它在Swift包中,所以Xcode 11也在尝试为macOS编译它。”我认为这里有一个误解。Xcode并不试图编译“同样适用于macOS”的Swift包。它所做的只是编译应用程序目标及其依赖项。如果您的应用程序是iOS应用程序,则只需编译iOS即可。我已经打开了这个包,在“产品”菜单下有一个“构建”选项。我的目标是构建包(一个库)并运行它的单元测试。我确实在工具栏的scheme selector中选择了“My Mac”,因为我想在Mac上运行单元测试,而不启动模拟器。实际上,我建议按照编译器的指示执行:使用
#if围绕UIKit导入和提及UIKit类型!操作系统(macOS)
#endif