使用SwiftUI改变心态

图片

上周,我看到社区正在尝试将经过验证的开发模式从UIKit转移到SwiftUI。 但是我确信,使用SwiftUI编写高效代码的最佳方法是忘记关于UIKit的所有知识,并完全改变用户界面开发方面的思路。 本周,我将讨论使用UIKit和SwiftUI进行开发之间的主要区别。

差异的定义


UIKit是一个命令性事件驱动框架,用于为iOS平台创建用户界面。 这意味着您必须在事件(例如,加载视图,单击按钮等)期间处理所有状态更改。此方法的一大缺点是难以将用户界面与其状态同步。 状态更改后,您必须手动添加/删除/显示/隐藏视图,并将其与应用程序的当前状态同步。

SwiftUI是用于为所有Apple平台创建用户界面的声明性框架。 在这种情况下,关键字是声明性的。 声明式意味着开发人员需要声明他想要实现的目标,框架将对此进行照顾。 该框架知道呈现用户界面的最佳方法。

UI = f(state) 

在SwiftUI中,用户界面是其状态的函数。 这意味着只要视图状态改变,它就会重新计数其主体属性并生成一个新视图。 考虑以下示例。

 struct ContentView: View { @ObservedObject var store: Store var body: some View { Group { if store.isLoading { Text("Loading...") .font(.subheadline) } else { Image("photo") .font(.largeTitle) } } } } 

在上面的示例中,有一个视图,显示文本“ Loading ...”,并在下载结束时显示图像。 ObserverObject是该视图的状态,并且一旦更改,SwiftUI就会重新计算body属性并分配一个新视图。 在使用UIKit进行开发的过程中,有必要手动隐藏/显示表示层次结构的元素,但是在SwiftUI中,无需添加/删除加载指示器。 SwiftUI中有几种描述视图状态的方法,有关视图的更多信息,请查看“ SwiftUI中的Property Wrappers ”。

现在,我们将仔细研究视图状态更改时发生的情况。 SwiftUI具有当前视图层次结构的烙印,并且一旦其状态更改,它就会计算一个新视图。 SwiftUI应用比较算法来了解差异并自动添加/删除/更新必要的视图。 默认情况下,SwiftUI使用标准的输入/输出过渡图像来显示/隐藏视图,但是也可以手动将过渡更改为任何其他动画。 要了解有关SwiftUI中的过渡和动画的更多信息,请参阅我的文章“ SwiftUI中的动画 ”。

表示层次


让我们讨论一下视图的层次结构以及SwiftUI如何实际显示视图的结构。 我要提到的第一件事是,SwiftUI不会通过一对一映射显示视图的结构。 可以使用任意多个视图容器,但最后,SwiftUI仅显示对渲染有意义的视图。 这意味着您可以将其逻辑提取为较小的表示形式,然后在应用程序中进行组合和重用。 不用担心,这种情况下的应用程序性能不会受到影响。 要了解有关在SwiftUI中创建视图的更多信息,请参阅本文

了解SwiftUI中复杂表示的层次结构的最佳方法是显示其类型。 SwiftUI使用静态类型系统来足够快地确定差异。 首先,它检查视图的类型,然后检查视图的组件的值。 我不喜欢在工作代码中使用反射,但是在学习过程中它非常有用。

 print(Mirror(reflecting: ContentView(store: .init()).body)) // Group<_ConditionalContent<Text, ModifiedContent<Image, _EnvironmentKe 

使用Mirror结构,您可以显示ContentView主体的实际类型,并了解SwiftUI的工作方式。

结论


这周,我们了解了UIKit和SwiftUI之间的主要区别,并详细研究了SwiftUI中的比较算法。 希望您喜欢这篇文章。 感谢您的阅读,下周见!

Source: https://habr.com/ru/post/zh-CN477560/


All Articles