在我被问到的所有有关 SwiftUI 的问题中,有一个问题出现的次数比其他问题都多。"我正在学习Swift:我应该学习 SwiftUI,还是我也需要学习 UIKit?"
人们似乎想听到的答案是:"忘掉 UIKit 这个老东西--你应该专注于 SwiftUI!" 然而,简单的事实是,绝大多数人都不会因为这个建议而获得成功,值得详细解释一下原因。
在讨论细节之前,我想明确一件事:SwiftUI 是一个了不起的用户界面框架,而且 100% 绝对会成为苹果平台上应用开发的未来。然而,如果你想在今天--或者说在未来一到两年左右的任何时候--建立伟大的应用,你也 100% 绝对需要一些 UIKit 的知识,特别是如果你打算把应用开发作为你的职业。
好了,言尽于此。专注于 SwiftUI 而忽视 UIKit 所产生的问题归结为以下三点:
让我们来分析一下...
无论你是想为公司工作,还是只是在业余时间建立业余应用程序,SwiftUI 的一个缺点是,它目前没有像 UIKit 那样广泛的 API 覆盖率。
例如,如果你想显示丰富的可编辑文本,你会使用 UIKit 中的 UITextView,但 SwiftUI 自己的 TextEditor 只会处理普通字符串。或者,如果你想在一个 Alert 中显示一个文本字段,在 UIKit 中就有,但在 SwiftUI 中却不可能。
这并不是苹果偷懒,相反,这似乎是故意的:他们不是先发布所有 API 的封装器,然后再进行修改,而是采取更谨慎的方法,逐步增加 API。这应该(我希望!)减少我们在未来看到的破坏性变化的数量,因为它给了苹果的工程师更多的时间来优化他们打算发布的 API 子集。
很多时候你会找到变通的办法,但说实话,当你知道某件事在 UIKit 中是微不足道就能实现的,但在 SwiftUI 中却很难,甚至是不可能的时候,你会感到很累。有时甚至是很简单的事情:如何改变一个表格上的分隔符嵌入?或者在一个文本字段中禁用智能引号?这些在 UIKit 中只是一行代码,但在 SwiftUI 中却无法奏效。
随着时间的推移,我完全希望看到更多的功能被添加到 SwiftUI 中,使其与 UIKit 看齐,但现在许多关键组件仍然缺失。
SwiftUI 是在 WWDC2019 上才宣布的,在 iOS13 设备或更高版本中才可以使用。这意味着:
这意味着,如果你打算在未来两年内找到一份 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 的存在并没有在某种程度上使 UIKit 过时:如果你打算在未来两年内找到一份iOS 开发工作,知道如何使用 UIKit 将是一个坚定的要求或一个强有力的奖励。
所以,直接回答这个问题:是的,应该忙着学习 SwiftUI,因为它是苹果平台上应用开发的未来,但你仍然需要学习 UIKit,因为这些技能在未来几年都会很有用。
随着时间的推移,上面列出的三个问题都会随着 SwiftUI 的壮大、普及和社区支持而减少,而随着 SwiftUI 的发展,UIKit 将开始枯萎。然而,至少在现在,你确实需要这两样东西。