有条件地在Swift中导入基于iOS版本的框架(如Speech)?

Mat*_*_PI 10 ios swift

有没有办法Swift根据运行时iOS版本有条件地导入框架?

特别是,我有一个部署目标为的应用程序iOS 8.Apple Speech如果在运行时可用,我想在应用程序中使用新框架.我知道#available(iOS 10, *)代码部分的@available(iOS 10, *)指令,以及可用于整个类的指令.因此,我可以轻松避免执行任何使用Speech框架的代码.但是在包含使用Speech的类的文件中,我需要"import Speech"语句,并且这两个指令都不能在那里使用.我发现即使我@available(iOS 10, *)在整个班级都有指令,当我在iOS 9设备上运行我的应用程序时,它会在启动时被杀死

"dyld: Library not loaded: /System/Library/Frameworks/Speech.framework/Speech".
Run Code Online (Sandbox Code Playgroud)

我是否遗漏了某些内容,或者是否只能在部署目标为10的应用中使用Speech框架?

Ali*_*dle 5

您可以选择框架(来自Ray Wenderlicht的详细信息和图像):

使框架可选

这与您对@available的使用相结合,可以防止系统尝试将其加载到不可用的设备上.

  • 这是行不通的,至少在这种情况下是这样。有趣的是,在 Apple 的示例 SpeakToMe 项目中,语音框架甚至没有链接到项目中,但无论如何它都能正常构建和运行(在设备上)。同样,在我的项目中,在 iOS 10 上,它无需链接语音框架即可工作。如果我继续添加框架,并将其设置为可选,它仍然可以在 iOS 10 上构建并运行,但在 iOS 9 上会遇到同样的崩溃。 (2认同)
  • 此解决方案是否也适用于第三方框架,还是仅适用于 Apple 的框架? (2认同)

Nic*_*rbo 5

你需要使用

#if canImport(YourFramework)
import YourFramework
#endif
Run Code Online (Sandbox Code Playgroud)

在将您的框架设置为可选之后,现在而不是 @available :-)

  • `canImport` 适用于平台,例如 iOS、watchOS,而不是操作系统的_版本_ (10认同)
  • 我仍然收到消息:“正在为 iOS 9.0 进行编译,但模块“ForestCore”的最低部署目标为 iOS 10.0” (6认同)