SwiftUI 七年:一场平庸的持续 Beta

SwiftUI After 7 Years

SwiftUI 七年:一场平庸的持续 Beta

距离 2019 年发布已过去七年,SwiftUI 本应成为 Apple 平台成熟的跨平台 UI 框架,但现实却令人沮丧。作为一名资深工程师,我发现它仍深陷性能瓶颈、布局不可预测和数据流混乱的泥潭。从 Apple 官方教程的 Bug 到与 UIKit 的性能对比,SwiftUI 似乎用便利性幻觉换取了工程精确性。这不仅是技术债务的累积,更折射出 Cupertino 从追求极致工艺向“够用就好”的企业文化转变。如果你也厌倦了为破碎的功能找借口、与布局 Bug 搏斗,这篇文章或许能道出你的心声。

在 SwiftUI 中,你永远无法确切知道一个视图会更新多少次,也无法理解它为何选择在那一刻更新。
  1. rayiner

    复杂系统的问题在于,你可能在意识到自己已经“死”了之前很久就已经死了。仅仅凭借过去明智决策的惯性和积累的基础设施,一切可能看起来“还不错”很长一段时间。你会看到一些磨损或裂痕,但整体看起来依然根基稳固,直到它不再稳固。

    苹果无法推出一个比前代更好的 UI 框架,这令人担忧。这家公司曾从 Toolbox 转向 Carbon,再转向 Cocoa,每一步都比上一步更好。如果 MacOS X 和 Cocoa 今天还不存在,苹果还能造出来吗?微软在二十年间未能推出 Win32 的真正继任者,这表明微软(至少是其操作系统部门)早在多年前就已经“死”了。我不禁想问,十年后我们是否也会对苹果做出同样的评价。

  2. sandoze

    这似乎是一个流行的“争议性”话题。自 2021 年以来,我一直在生产应用和游戏中使用 SwiftUI。必要时,我会降级使用 UIKit、Metal 或 Core Animation。但这与我以前用 UIKit 做游戏时,必要时降级使用 Core Animation 或 C 语言编写的字形渲染器并没有什么不同。

    数据流:作者声称无法知道何时会发生更新。不仅经验能帮上忙,还有分析工具可以告诉你何时、何地发生了更新。这并非黑魔法。保持 View 小巧,小心地传递数据。@environment 非常酷,但可能会产生级联效应。这在 iOS 17+ 中得到了极大改进,我不再支持比 iOS 17 更老的版本。

    GeometryReader:我偶尔会使用它。在处理某些视图复杂性时,它有点像是必要的恶。它也可能表明你做错了什么。

    API 稳定性和性能:苹果用户会升级系统。此时没有任何理由去支持 iOS 17——甚至 iOS 18 在我们多个应用中的用户占比也仅约 2%。我一直使用 SwiftUI 且没有遇到重大性能问题,但我也不会过早优化。我会根据需要进行分析并修复。我早期工作过的一家工作室将所有游戏原型都用 UIKit 编写,当性能崩溃时,我们会切换到必要的工具(例如 OpenGL)——就像在核心游戏逻辑中那样。

    我还可以继续说下去,但归根结底,只是为工作选择正确的工具,如果你不精通……

  3. cosmic_cheese

    我肯定很多人会不同意,但我怀疑纯声明式 - 响应式(declarative-reactive)并不是通用原生 UI 框架的“正确”形态。据我的经验,Kotlin+Compose 也有许多类似的毛病……它主要的可取之处在于它比 Android Framework 更好(大多数时候),但这门槛其实很低。

    这些框架有很多好点子,但它们未必能以一种超越高质量传统命令式框架(其中点缀着声明式 - 响应式片段)的方式结合起来,至少对于更复杂的应用来说是这样。SwiftUI 及其同类框架最适合那种超级简单的、只有标签页和平铺列表的应用。

  4. spacedcowboy

    苹果在 ObjC 和 AppKit 上曾有过真正的赢家。Swift 相对于 ObjC 所提供的优势而言,其复杂性令人发指,而 SwiftUI 则是相对于 AppKit 的巨大倒退。

    这只是我个人的看法(MHO),也阻止不了这股势不可挡的洪流,但对我来说,转向那里毫无吸引力 :( 如果(当?)苹果放弃 ObjC,那就是我转向 Linux 的日子。

  5. emehex

    我注意到,那些从 UIKit 起步的开发者真的很难适应 SwiftUI。我认为这是因为这不仅仅是新语法,而是一种完全不同的思维方式:状态是真理之源,视图是短暂的,你是在描述 UI 而不是管理它。

  6. peheje

    尽管有各种趋势,我依然非常喜欢用 HTML 做结构,CSS 做样式,JavaScript 做逻辑。

    界限并不完美清晰,但这没关系。这种分离提供了一种有用的思考方式:先构建结构,再处理样式,在需要的地方添加行为。

    我对 Compose 的体验——虽然我怀疑 SwiftUI 用户会有同感——是我必须时刻、处处思考一切。

    然后我们加上一些 MVVM/UDF 的风味。“ViewModel”对视图一无所知,尽管它通常只为一个屏幕服务。添加一些“MutableStateFlow”,将它们组合成“ScreenUiState”,将其暴露为“StateFlow”,并结合生命周期感知进行收集。

    解耦得完美无瑕。极其易于测试。

    然后公司完全不写单元测试,完全依赖每晚运行两小时的屏幕测试。

    欢迎页的重构搞崩了个人资料页。

    “你没检查夜间构建吗?”

    没有。它是晚上跑的。

    “好吧,那是你的责任。”

    但你把它搞坏了。

    “是的,但那是你的代码。”

    那为什么我们还发布了?

    行吧。安排个事后复盘,叫上我妈一起来。

    而且我在这里并不是在责怪移动开发者。我是前端、后端、全栈,现在大概也算 AI 工程师。我亲自参与过整个技术栈中把简单事情变复杂的过程。

    我喜欢 Web 的一点是,一个简单的屏幕可以用原生 JavaScript,另一个可以用 Vue,还有一个可以用某种专用的表格组件。

    人们对此反应惊恐:如果组件重复了怎么办,……

  7. happytoexplain

    AutoLayout 虽然像其他东西一样有缺陷,但仍然是所有平台上 UI 的巅峰。

    SwiftUI 是一次值得称赞的尝试,旨在让 UI 开发变得“傻瓜-proof”,但它牺牲了太多,最终失败了。

  8. slopinthebag

    Swift 是我用过的最糟糕的语言。作为背景,我用过从 JavaScript 到 C++ 的所有语言,而我现在的选择是 Rust。

    Swift 感觉难以穿透。太多的语法和特性是“渐进式披露”的(顺便说一句,这是糟糕的 UX 范式),但它们只是突然跳出来,破坏线程语义,工具链也烂透了。它也是唯一一种我无法让 AI 表现还不错的语言,这是双重打击。

    我讨厌 Swift 到了极点。

同日更多故事

2026-08-02