回答这个大问题: 你应该学习 SwiftUI,UIKit,还是两者都学?

Updated for Xcode 13 New in macOS 12

在我被问到的所有有关 SwiftUI 的问题中,有一个问题出现的次数比其他问题都多。“我正在学习Swift:我应该学习 SwiftUI,还是我也需要学习 UIKit?”

人们似乎想听到的答案是:“忘掉 UIKit 这个老东西—你应该专注于 SwiftUI!” 然而,简单的事实是,绝大多数人都不会因为这个建议而获得成功,值得详细解释一下原因。

在讨论细节之前,我想明确一件事:SwiftUI 是一个了不起的用户界面框架,而且 100% 绝对会成为苹果平台上应用开发的未来。然而,如果你想在今天—或者说在未来一到两年左右的任何时候—建立伟大的应用,你也 100% 绝对需要一些 UIKit 的知识,特别是如果你打算把应用开发作为你的职业。

好了,言尽于此。专注于 SwiftUI 而忽视 UIKit 所产生的问题归结为以下三点:

  1. 受限的 API 覆盖。
  2. 有限的普及率。
  3. 有限的(社区)支持。

让我们来分析一下…

受限的 API 覆盖

无论你是想为公司工作,还是只是在业余时间建立业余应用程序,SwiftUI 的一个缺点是,它目前没有像 UIKit 那样广泛的 API 覆盖率。

例如,如果你想显示丰富的可编辑文本,你会使用 UIKit 中的 UITextView,但 SwiftUI 自己的 TextEditor 只会处理普通字符串。或者,如果你想在一个 Alert 中显示一个文本字段,在 UIKit 中就有,但在 SwiftUI 中却不可能。

这并不是苹果偷懒,相反,这似乎是故意的:他们不是先发布所有 API 的封装器,然后再进行修改,而是采取更谨慎的方法,逐步增加 API。这应该(我希望!)减少我们在未来看到的破坏性变化的数量,因为它给了苹果的工程师更多的时间来优化他们打算发布的 API 子集。

很多时候你会找到变通的办法,但说实话,当你知道某件事在 UIKit 中是微不足道就能实现的,但在 SwiftUI 中却很难,甚至是不可能的时候,你会感到很累。有时甚至是很简单的事情:如何改变一个表格上的分隔符嵌入?或者在一个文本字段中禁用智能引号?这些在 UIKit 中只是一行代码,但在 SwiftUI 中却无法奏效。

随着时间的推移,我完全希望看到更多的功能被添加到 SwiftUI 中,使其与 UIKit 看齐,但现在许多关键组件仍然缺失。

有限的普及率

SwiftUI 是在 WWDC2019 上才宣布的,在 iOS13 设备或更高版本中才可以使用。这意味着:

  • 迄今为止编写的几乎所有应用程序都使用 UIKit。
  • 任何需要支持 iOS n-2 或更早的应用程序(例如 iOS 12),甚至在一年或更长时间内不能开始切换到 SwiftUI。

这意味着,如果你打算在未来两年内找到一份 iOS 开发者的工作,UIKit 经验实际上是强制性的,因为这是现有代码库使用的。事实上,我完全期待 UIKit 在一两年内仍然是主导的 UI 平台。没有人—我想连苹果也不例外!没有人期望 iOS 社区会在一两年内迁移。- 没有人期望 iOS 社区会以任何形式的快速迁移到 SwiftUI 上。在 UIKit 应用程序中投入了大量的代码、大量的时间和大量的资金,它还有很长的幸福生活要走。

有些人试图把采用 Swift 和采用 SwiftUI 相提并论,我认为这没有什么用。Swift 的采用速度很快,因为它适用于苹果支持的每一个框架(UIKit、SpriteKit 等),并且已经支持 iOS n-1,所以许多公司可以立即切换到它。

我想再次重申,SwiftUI 绝对会成为苹果平台开发的未来,但它需要很长的时间来获得 UIKit 水平的普及率。

同时,SwiftUI 是小型应用、个人应用、业余应用、原型应用或一般实验的完美人选。如果你有幸加入一家专门使用 SwiftUI 的公司,那就好好享受它吧!

有限的(社区)支持

UIKit 已经存在了十多年,这意味着:a)你可能面临的几乎每一个问题都可能已经被别人遇到并解决了;b)有很多库提供扩展和定制。

虽然有些学习者可能会想象高级开发人员的脑子里有大量的 UIKit,但一个不争的事实是,我们都在使用 Google、Stack Overflow、Hacking with Swift 等等来寻找解决问题的方法。当你走投无路的时候,可能就是把错误信息粘贴到一个网站上,但无论你是如何得到答案的,都会节省大量的时间在网上寻找答案。

SwiftUI,仅仅是由于它明显较新,可用的解决方案明显较少。事实上,寻找以前没有人试过的东西是很常见的—你简直是第一个人。这可能是一个很大的乐趣,但如果你有一个实际的项目,而你又确实想把它运出去,这也可能是一个令人沮丧的时间沉淀。

那么…你是说我不应该学习 SwiftUI?

不!SwiftUI 工作起来非常有趣,你可以用它来构建了不起的东西。这本书的其余部分都是为了帮助你尽可能快速有效地开始使用 SwiftUI—如果我不认为 SwiftUI 很棒,我就不会写这本书。

我想说的是,SwiftUI 的存在并没有在某种程度上使 UIKit 过时:如果你打算在未来两年内找到一份iOS 开发工作,知道如何使用 UIKit 将是一个坚定的要求或一个强有力的奖励。

所以,直接回答这个问题:是的,应该忙着学习 SwiftUI,因为它是苹果平台上应用开发的未来,但你仍然需要学习 UIKit,因为这些技能在未来几年都会很有用。

随着时间的推移,上面列出的三个问题都会随着 SwiftUI 的壮大、普及和社区支持而减少,而随着 SwiftUI 的发展,UIKit 将开始枯萎。然而,至少在现在,你确实需要这两样东西。