如何合并框架 SwiftUI

Sha*_*mil 7 xcode ios swift swiftui

我们只能从 iOS 13.0+ 使用 Framework SwiftUI。那么如何从部署目标 10.0 或至少 12.0.

在此处输入图片说明

Ren*_*tus 10

虽然@DenFav是绝对正确的 - 使用 SwiftUI 支持 iOS 13 以下的部署目标是一种痛苦,但这是可能的。

脚步:

  1. 弱链接框架(我使用了这个答案):

    将 -weak_framework SwiftUI 添加到其他链接器标志修复了我的问题

  2. 使用 canImport 包装所有 SwiftUI 调用(请参阅答案):

    #if canImport(SwiftUI) && canImport(Combine)

这将允许您使用部署目标 < iOS 13 进行构建和存档。

可选的:

现在的问题是:如何处理viewModels。我用我自己的实现解决了这个问题。您可以在Ruuvi Station的public repo中查看解决方案。注意:代码很复杂(VIPER),这就是为什么我将简要描述主要思想的原因。

viewModel 实现位于Classes/Presentation/Binding 中

我正在使用这些视图模型,并将它们包装ObservableObject在 SwiftUI 中。

您仍然可以观察SwiftUI 代码所做的更改。

结果是:iOS 13 使用SwiftUI 代码作为表示层,而 iOS 12 及更低版本使用传统的UIKit 代码

viewController 负责确定是否可以使用 SwiftUI 代码。


Den*_*Fav 0

没有合理的方法可以做到这一点。#available 或 @available 允许您区分某些代码或整个类,但不能区分应用程序本身。

您可以使用 @available 来消除 12.0 部署目标的 SwiftUI 结构或类的警告,但在这种情况下,您需要使用 Swift UI 从故事板(.xib 等)完全复制 UI。此外,完全不同的“绑定”方法还要求您重新实现该应用程序中的现有逻辑(无论您之前使用过哪种架构)。任何 VIPER、VIP、MVC 的目的都是向 ViewController(View) 发送一些数据更改通知?在 Swift UI 中你需要使用 Bindable 对象。它还会导致您创建 ViewModel 的副本(如果有的话),因为它们会有所不同。

结果?你有 UI 的第二次实现,视图模型的第二次实现,Presenter 的额外 80% 的实现(或者你使用什么)。只有数据库和休息管理器将被重用。如果你有非常好的架构,这是有效的。不要忘记您需要支持 UI 和逻辑两个分支。

有两种方法:重新开发几乎完整的应用程序以支持 SwiftUI 和 UIKit,或者,如果您不想只支持一个 iOS 13,请等到 iOS 14 发布,然后使用 SwiftUI 支持两者