如何将Swift声明标记为在iOS中可用而在macOS中不可用
我有一个只在iOS 10.0及以上版本上运行的类。它在一个Swift包中,所以Xcode11也在尝试为macOS编译它,并且抱怨。我怎么说它只在iOS 10.0上可用 这些不起作用:如何将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)
@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
。