SwiftUI 2021 五大优点 七大劣势

在过去的 8 个月里,我一直在 SwiftUI 中开发复杂的应用程序,包括我们最近在 App Store上架的Fave应用程序。我遇到了无数限制,并找到了解决我遇到的大多数挑战的方法。
简而言之,SwiftUI 是一个美妙且非常有前途的框架。我 认为这是未来。但是,要达到与 UIKit 相同的可靠性和稳健性,可能还需要 3 到 5 年的时间。但是,这并不意味着您今天不应该使用 SwiftUI。我的目标是帮助您了解权衡和缺点,以便您可以就 SwiftUI 是否适合您的下一个项目做出更明智的决定。
好的

1. SwiftUI是写一个欢乐,你几乎可以构建太快

飘的日子addSubview和sizeForItemPath,精心计算帧,约束摔跤,并用手建立视图层次结构。SwiftUI 的声明式和反应式设计模式使创建响应式布局和 React 一样简单,而且还使用了 Apple 强大的 UIKit。构建视图并启动和运行的速度非常快。

2. SwiftUI 简化跨平台开发

我最兴奋的一件事是,您可以编写一次 SwiftUI,然后在 iOS(iPhone 和 iPad)、WatchOS 和 MacOS 上使用它。您必须为 Android 和 Windows 开发和维护单独的代码库,这已经够麻烦了,所以每一点都有助于减少不同代码库的数量。还有一些缺点,我将在“坏”部分分享。

3. 免费获得精美的转场、动画和组件

您可以将 SwiftUI 视为一个实际的 UI 套件,它提供了制作具有专业外观的 Apple 应用程序所需的所有构建块。如果您熟悉 CSS 转换,SwiftUI 有自己的版本,可以非常轻松地创建精美的交互。声明式语法的美妙之处在于,事情“可以正常工作”并且看起来很神奇,但也有阴暗的一面,我也会在“坏事”部分进行介绍。

4. UI 完全是状态驱动和反应式的

如果您熟悉 React,SwiftUI 的工作原理是一样的。相反回调地狱,你改变@State并@Binding和@Published高兴的属性,你看你的整个UI“反应”,动画和所有。您可以利用CombinewithObservableObject和的力量@StateObject。这方面是 UIKit 最酷的变化之一,感觉非常强大。

5. 社区正在接受 SwiftUI

几乎每个人都对 SwiftUI 感到兴奋。有很多资源可用于学习 SwiftUI,从 WWDC,到书籍,再到博客——信息就在那里,你只需要搜索它。不管是不是,我在这里汇总了一份最佳社区资源列表。
拥有一个充满活力和支持的社区将加速学习和开发,大量新库的出现将使 SwiftUI 更加通用。

坏的

1. SwiftUI 中并非所有东西都可用

有许多组件缺失、不完整或过于简单,我将在下面详细介绍其中一些组件。
有一个使用UIViewRepresentable UIViewControllerRepresentable和的解决方案UIHostingController。前两者允许您将 UIKit 视图和控制器嵌入到 SwiftUI 视图层次结构中。后者允许您在 UIKit 中嵌入 SwiftUI 视图。Mac 开发存在相同的三个(NSViewRepresentable等)。
这些桥梁是弥补 SwiftUI 缺失功能的一个很好的止损,但它并不总是一种无缝体验。此外,虽然 SwiftUI 的跨平台承诺很棒,但如果某些东西不可用,您仍然需要为 iOS 和 Mac 实现两次桥接代码。

2. NavigationView 还没有

如果您想隐藏导航栏但仍然可以使用滑动手势,则不能。我最终从我找到的一些代码中创建了一个UINavigationController 包装器。它有效,但长期来看不是一个很好的解决方案。
如果你想在 iPad 上有一个 SplitView,你还不能在纵向模式下同时显示主视图和细节视图。他们选择了一个笨拙的按钮来显示一个默认关闭的抽屉。显然你可以通过添加 padding 来解决这个问题,这突出了你在争论 SwiftUI 时必须做的事情。😂
NavigationLink当您想以编程方式导航时,这有点时髦。这是一个有趣的讨论。

3.文本输入非常有限

TextField,TextEditor现在太简单了,你最终会回到UIKit。我必须为 UITextField 和 UITextView 构建自己的 UIViewRepresentable(具有自动增长支持)。要点如下:

4. 编译器挣扎

当您的视图变得更强大并且您已尽最大努力将其分解时,编译器仍然可以喘口气,告诉您:
编译器无法在合理的时间内对该表达式进行类型检查……
这让我慢了很多次。我已经擅长注释代码并将其缩小到导致问题的行,但在 2021 年调试这样的代码感觉真的很倒退。

5. 匹配几何效果

当我第一次发现这个时,我觉得这太神奇了。它应该通过在一个出现和另一个消失时匹配它们的几何图形来帮助您更无缝地转换具有不同身份的两个视图。我认为这将有助于从视图 A 到视图 B 进行漂亮的过渡。
我一直想让它工作。最终,我远离这个,因为它不完美,并且当您在包含大量项目的 List 或 ScrollView 中使用它时会导致崩溃。我只建议将它用于同一视图中的简单转换。当你在多个不同的视图之间共享一个命名空间时,事情开始变得很奇怪,包括过渡期间的视图剪辑。

6. 手势有限

SwiftUI带有一组新的手势(即DragGesture,LongPressGesture),可以使用被添加到视图gesture方便改性剂像tapGesture和longPressGesture。在您想要进行更复杂的交互之前,它们都可以正常工作。
例如,DragGesture与ScrollView. 将一个放在 ScrollView 中可以防止滚动,即使使用simultaneousGesture修饰符也是如此。在其他情况下,拖动手势可能会在没有任何通知的情况下被取消,从而使手势处于未完成状态。
为了解决这个问题,我构建了自己的GestureView,它允许我在 SwiftUI 中使用 UIKit 手势。我将在下一篇关于最佳 SwiftUI 库和解决方法的文章中分享这一点。

7. 共享扩展中的 SwiftUI

我可能是错的,但 Share Extensions 仍然使用 UIKit。我通过利用 SwiftUI 构建了一个共享扩展,UIHostingController并且在加载共享扩展时出现了明显的延迟,从而造成了糟糕的用户体验。您可以尝试通过动画视图来屏蔽它,但它仍然有大约 500 毫秒的延迟。
荣誉奖
无法访问状态栏(无法更改颜色或拦截点击)
@UIApplicationDelegateAdaptor需要,因为App仍然缺乏
没有向后兼容性
UIVisualEffectsView 在 < iOS15 (h/t @AlanPegoli) 中导致滚动延迟

丑陋的

1.滚动视图

这是迄今为止最大的缺点之一。任何开发过定制化 iOS 应用的人都知道我们在多大程度上依赖 ScrollView 来支持交互。
重大问题: LazyVStack在ScrollView 中会导致卡顿、抖动和意外行为。LazyVStacks 对于需要滚动的混合内容的长列表至关重要,例如新闻提要。仅此一项就使 SwiftUI 尚未做好生产准备。Apple 已经向我确认这是 SwiftUI 中的一个错误。目前还不清楚他们何时会修复它,但是当他们修复它时,这将是一个巨大的胜利。
滚动状态。没有对理解滚动状态的原生支持(滚动视图是否在拖动?滚动?偏移量是多少?)。尽管有一些解决方法,但它们可能很挑剔且不稳定。
分页。没有对分页滚动视图的本机支持。所以,忘记做类似可滑动的媒体库之类的事情(但如果你想要接近的东西,请使用SwiftUIPager)。从技术上讲,您可以使用TabViewwith PageTabViewStyle,但我认为它更适用于少数元素而不是大型数据集。
表现。使用 aList是性能最好的,并且避免了 LazyVStack 的卡顿问题,但由于转换的工作方式,它仍然不适合显示可变大小的内容。例如,在构建聊天视图时,过渡很奇怪并且会剪辑孩子,并且您无法控制插入动画样式。
判决
我认为你绝对应该学习SwiftUI,自己理解它,体验它的乐趣。只是推迟完全采用它。
SwiftUI 不仅适用于简单的应用程序,但在撰写本文时(iOS 15,beta 4),我认为 SwiftUI 还没有为复杂的应用程序做好生产准备,主要是由于 ScrollViews 的问题和对 UIViewRepresentable 的严重依赖. 它伤了我的心。特别是对于消息产品、新闻提要以及严重依赖复杂视图或想要创建手势驱动的定制体验的产品,目前还不想使用 SwiftUI。
如果你想要细粒度的控制和无限的可能性,我建议在可预见的未来坚持使用 UIKit。通过使用UIHostingController包含 SwiftUI 视图,您仍然可以从某些视图(如设置页面)中获得SwiftUI 的好处。

未来该何去何从?

当我们开始着手我们项目的下一个大迭代时。我知道这个新项目的交互范围超出了 SwiftUI 当前支持的范围。知道 SwiftUI 在某些关键方面存在不足让我心碎,但我还没有准备好回到 UIKit,知道在 SwiftUI 中构建它是多么令人愉快。它只是快得多。
SwiftUI 会匹配 UIKit 吗?如果是这样,我们可能需要 3 到 5 年的时间来移植所有基本的 UIKit API。如果没有,那么你总是能够进入 UIKit 并用 SwiftUI 包装它。
我很好奇的是 Apple 在 SwiftUI 上的投入程度。他们的长期计划是让所有开发人员完全采用 SwiftUI,还是只是成为另一个 Interface Builder?我真的希望不会。我希望他们全力支持 SwiftUI,因为它的承诺令人惊叹。


精品教程推荐


加入我们一起学习SwiftUI

QQ:3365059189
SwiftUI技术交流QQ群:518696470
教程网站:www.openswiftui.com

发表回复