欢迎访问 weekly.fatbobman.com[1] 订阅本周报的中英文电子邮件版本。你也可以直接访问我的网站 肘子的 Swift 记事本[2] 更多的周报内容。
肘子的话
不要等到遇到障碍时才意识到无障碍的重要性
5 月 16 日(每年五月的第三个星期四)是今年的全球无障碍意识日(GAAD[3])。这个年度活动旨在提醒开发者、设计师及相关从业人员关注其数字产品和服务的无障碍性。活动强调,对残障人士而言,技术的无障碍性至关重要,无障碍设计可以帮助他们更便利地使用网站、应用程序和各种数字设备。
全球无障碍意识日的共同创始人之一,Joe Devon,在 2011 年发表的一篇文章中阐述了一个理念:“数字世界应该向所有人开放,包括那些有残障的人。”这篇文章成为了该活动的发起灵感。
尽管苹果为开发者提供了丰富的 API 来支持应用的无障碍功能开发,但要为应用提供无障碍适配仍需耗费大量人力、精力及其他资源。从纯商业的角度来看,对于多数项目来说其投入产出比也并不理想。正因如此,更多的公司、开发者和社会人士需要充分认识到无障碍的重要性及其社会价值,而不应仅从经济效益的角度评估其回报。
随着 Apple Vision Pro 等新型设备以及多模态 LLM 的不断涌现,无障碍技术的实现手段和前景都得到了显著扩展和提升。
对多数开发者而言,一次性完全实现项目的无障碍化无疑是一个巨大的挑战。但只要坚持无障碍愿景,逐步改进,当你的项目能服务于更广泛的用户群体时,你会发现所有的努力都是值得的。
我们不应该等到遇到障碍时才认识到无障碍的重要性。行动起来,通过我们的努力为每一个人提供便利和机会。
在今年的全球无障碍意识日(GAAD),苹果公司宣布推出一系列 新的辅助功能[4],这些功能进一步扩展了其技术的包容性。这包括了为 iPhone 和 iPad 新增的眼动追踪(Eye Tracking)、音乐触觉(Music Haptics)和人声快捷键(Vocal Shortcuts)。此外,苹果还为 visionOS 引入了实时字幕(Live Captions)和盲文屏幕输入(Braille Screen Input)等创新功能。
前一期内容|全部周报列表
原创
在 SwiftUI 中,spacing = nil 表示什么?[6]
Fatbobman( 东坡肘子 )[7]
在 SwiftUI 中,许多布局容器的构造函数都包含一个默认值为 nil
的 spacing
参数,该参数负责控制临近视图之间的间隙。本文将从这一默认参数出发,深入探讨 SwiftUI 中的 Spacing
概念,并分享一些相关的技巧及注意事项。
近期推荐
Swift sucks at web serving… or does it? ( Swift在Web服务上表现糟糕……真的吗? )[8]
Wade Tregaskis[9]
Wade Tregaskis 在这篇文章中深入分析了 Swift 在 web 服务领域的性能。通过一项性能基准测试,他比较了 Swift Vapor、Node. js、PHP FPM NGINX 和 Kotlin Helidon 等技术实现的 web 服务器在处理负载时的表现,特别关注了吞吐量、延迟、RAM 使用和电力消耗等指标。虽然初次测试显示 Swift 的 Vapor 框架在吞吐量上较低,请求失败率较高,但经过社区合作和技术调优后,Vapor 显著改善了性能,特别是在吞吐量和延迟方面。这些发现表明,尽管 Swift 在 Web 服务器市场的占比不大,但其性能和优化潜力令人瞩目,足以与其他主流技术相匹敌。
Debugging Animations ( 调试 SwiftUI 动画 )[10]
objc.io[11]
在 SwiftUI 中,动画由状态变化触发。系统根据开发者设置的动画函数,为变化的组件创建状态插值。然而,开发者无法在动画过程中进行干预,比如在特定位置暂停动画。在本文(附视频)中, Chris Eidhof[12] 和 Florian Kugler[13] 介绍了如何利用 WWDC 2023 推出的 CustomAnimation 功能来精确控制动画进程。他们通过将此功能集成到视图修饰符中,并结合滑块输入来更新动画,从而使动画调试过程更为直观和有效。
@LiveModel in SwiftData[14]
Pat[15]
SwiftData 利用 Swift 的现代并发模型,为开发者提供了一种优雅、安全、高效的数据处理方式。然而,许多开发者已经注意到,在非主上下文中进行数据更新时,尽管数据在后台已成功更新,视图中的数据却常常无法及时反映这些变化。为应对此问题,Pat 提出了一种名为 @LiveModel
的属性包装器解决方案。该包装器能确保无论在哪个上下文中进行的数据变更,都能够即时地反映到 UI 上,从而有效解决了数据和视图之间的同步问题。
Reducing iOS Test execution time with Selective Testing ( 通过选择性测试减少 iOS 测试执行时间 )[16]
Tuan Hoang[17]
在这篇文章中,Tuan Hoang(Eric)探讨了自动化测试在保证项目质量中的重要性及其随着测试数量增加导致的执行时间问题。例如,Eric 曾在他前公司的项目中遇到一个问题:超过 3000 个单元测试每天需要花费大约 420 分钟来运行。为了解决这个问题,他提出了一个“选择性测试”方案。这种方法通过分析代码变更影响的模块,并只对这些模块执行测试,显著减少了测试执行时间。选择性测试通过生成模块依赖图、计算模块哈希、利用缓存哈希比对、更新测试计划以及缓存更新五个步骤实现。此方案不仅提高了测试效率,也减轻了持续集成系统的负担。
Backend APIs: Constant evolution but tethered to the past ( 后端APIs:持续演进与历史羁绊 )[18]
Thomas Durand[19]
在现代应用开发中,快速上线和持续迭代是常态。当移动应用依赖后端服务时,后端 API 的管理就显得尤为重要。Thomas Durand 在本文中探讨了如何在引入新功能的同时确保 API 的向后兼容性,阐述了一系列策略如版本控制和向后兼容的变更,确保不同版本的应用能平滑过渡并减少用户干扰。文章强调,与常规应用开发相比,API 管理需要更加精细的规划和强化的测试,这对于保持应用的稳定运行和用户满意度至关重要。
文章中提到的示例和测试都基于 Vapor 框架进行说明,展现了如何处理 API 的逐步演化而不牺牲旧版本应用的功能性。
Craftsmanship & Consideration ( 工匠精神与深思熟虑 )[20]
David Smith[21]
自 2009 年起,David Smith 已连续参加了所有的 WWDC,这已成为他年度工作的重要组成部分。在这篇文章中,David 分享了他对即将到来的 2024 年 WWDC 的期待,以及他对多年来参与这一活动的深刻反思。他强调,对 WWDC 的兴奋不仅仅因为活动本身,更因为能够与一群共享工匠精神和深思熟虑价值观的人相聚。David 阐述了这个社区的核心价值观——工匠精神(Craftsmanship)和深思熟虑(Consideration),并表达了通过与这样的社区互动,不断学习和成长的渴望。
THANK YOU
如果你觉得这份周报或者我的文章对你有所帮助,欢迎 点赞、赞赏,并将其 转发 给更多的朋友。
参考资料
[1]
weekly.fatbobman.com: https://weekly.fatbobman.com
[2]
肘子的 Swift 记事本: https://fatbobman.com
[3]
GAAD: https://gaad.foundation/?issue=031&utm_source=FatbobmanWeekly&utm_medium=email&utm_campaign=FatbobmanWeekly031
[4]
新的辅助功能: https://www.apple.com.cn/newsroom/2024/05/apple-announces-new-accessibility-features-including-eye-tracking/
[5]
官网: https://gaad.foundation/?issue=031&utm_source=FatbobmanWeekly&utm_medium=email&utm_campaign=FatbobmanWeekly031
[6]
在 SwiftUI 中,spacing = nil 表示什么?: https://fatbobman.com/zh/posts/spacing-of-swiftui/?issue=031&utm_source=FatbobmanWeekly&utm_medium=email&utm_campaign=FatbobmanWeekly031
[7]
Fatbobman( 东坡肘子 ): https://twitter.com/fatbobman
[8]
Swift sucks at web serving… or does it? ( Swift在Web服务上表现糟糕……真的吗? ): https://wadetregaskis.com/swift-sucks-at-web-serving-or-does-it/?issue=031&utm_source=FatbobmanWeekly&utm_medium=email&utm_campaign=FatbobmanWeekly031
[9]
Wade Tregaskis: @everything@wadetregaskis.com
[10]
Debugging Animations ( 调试 SwiftUI 动画 ): https://talk.objc.io/episodes/S01E405-debugging-animations/?issue=031&utm_source=FatbobmanWeekly&utm_medium=email&utm_campaign=FatbobmanWeekly031
[11]
objc.io: https://twitter.com/objcio
[12]
Chris Eidhof: https://twitter.com/chriseidhof
[13]
Florian Kugler: https://twitter.com/floriankugler
[14]
@LiveModel in SwiftData: https://patstechweblog.com/posts/2-live-model/?issue=031&utm_source=FatbobmanWeekly&utm_medium=email&utm_campaign=FatbobmanWeekly031
[15]
Pat: https://mastodon.social/@fancypat
[16]
Reducing iOS Test execution time with Selective Testing ( 通过选择性测试减少 iOS 测试执行时间 ): https://levelup.gitconnected.com/reducing-ios-test-execution-time-with-selective-testing-384879e5f243/?issue=031&utm_source=FatbobmanWeekly&utm_medium=email&utm_campaign=FatbobmanWeekly031
[17]
Tuan Hoang: https://www.linkedin.com/in/tuan-hoang-b02025183/
[18]
Backend APIs: Constant evolution but tethered to the past ( 后端APIs:持续演进与历史羁绊 ): https://blog.thomasdurand.fr/story/2024-05-12-backend-api-tethered-to-the-past/?issue=031&utm_source=FatbobmanWeekly&utm_medium=email&utm_campaign=FatbobmanWeekly031
[19]
Thomas Durand: https://twitter.com/deanatoire
[20]
Craftsmanship & Consideration ( 工匠精神与深思熟虑 ): https://www.david-smith.org/blog/2024/05/15/craftsmanship-and-consideration/?issue=031&utm_source=FatbobmanWeekly&utm_medium=email&utm_campaign=FatbobmanWeekly031
[21]
David Smith: https://twitter.com/_DavidSmith