# 73 - 在嘉年华中感受苹果开发者的热情

发表于

Article Image

为期两天的 Let’s Vision 2025 在欢乐的氛围中圆满落幕,这是我作为讲师第二次参与此项盛会。与去年相比,今年的活动不仅全面覆盖了苹果开发生态,还融入了当下最炙手可热的 AI 领域内容。

于我而言,收获远不止于从众多专家的分享中的汲取知识,更珍贵的是与全球各地开发者面对面深入交流的机会。其中不少是我长期在线上关注或互动的同行。那份面对面的微笑与交谈,带来了网络世界无法替代的真实连接。

真正令我惊叹的是今年活动的规模与形式。组委会将会场选在了远离上海市中心的一处园林中,起初得知地点时,我曾担忧距离会削弱参与热情。然而抵达现场后,嘉年华式的场地布置、热烈的氛围,加上天公作美的好天气,点燃了所有人的激情。这种看似”另类”的选择,最终效果却出人意料地精彩。除了数十场专业演讲外,众多参展商为与会者带来了新颖的产品与创意。尤其值得称赞的是,组委会为许多小团队和个人开发者提供了免费展示平台,不仅让他们展示作品,还创造了相互交流及与潜在投资者对接的宝贵机会。

让所有与会者惊讶的是,如此大规模的活动,组委会成员竟全部是利用业余时间筹办。他们各自都有本职工作,这不仅需要卓越的时间管理和项目协调能力,更需要对社区的真挚热爱作为坚实支撑,方能全情投入其中。对于他们的无私奉献,最好的感谢方式莫过于见证苹果开发社区蓬勃发展的景象。每个人既是参与者,也是社区愿景的共同缔造者。

这几天充实而忙碌,难免有些疲惫。本期周报部分内容是在归途中完成的,但一想到即将与家人和我心爱的猫狗重聚,疲惫感便瞬间烟消云散。衷心期盼,这种嘉年华般的活动氛围能在苹果开发生态中生生不息,长久延续。

原创

Animatable 协议:让 SwiftUI 动画不再“失控”

在 SwiftUI 开发中,你是否遇到过看似正确的动画代码却无法按预期工作的情况?或者在某些 iOS 版本上完美运行的动画,却在其他版本上表现异常?这些令人困扰的动画问题往往可以通过一个强大而低调的工具来解决 —— Animatable 协议。本文将探讨如何用 Animatable 提升动画的精准度和一致性,让 SwiftUI 动画更稳定、精准。

近期推荐

Swift 6.1 在并发上的变化 (New Concurrency Stuff with 6.1)

Swift 6.1 将随 Xcode 16.3 一并提供,Matt Massicotte 在本文中介绍了几个 Swift 6.1 并发方面的改进。尽管没有革命性的新特性,但这些调整有助于提升开发体验,减少心智负担。

isolated deinit() 原计划在 6.1 中引入,以支持析构方法的 Actor 隔离,但目前已被推迟至未来版本。

Task.sleep() vs. Task.yield(): The differences explained

在 Swift 并发中,Task.sleep()Task.yield() 都会暂停任务的执行,但方式不同。Antoine van der Lee 在本文中解释了它们的差异:Task.sleep() 让任务暂停指定时间,不阻塞底层线程,并支持取消;Task.yield() 则让当前任务主动让出执行权,使其他任务有机会运行,但如果没有更高优先级的任务,可能不会产生实际作用。一般来说,Task.sleep() 适用于引入固定延迟,如防抖输入或限流请求,而 Task.yield() 更适用于测试和优化任务调度。

基于枚举构建 ViewModel (An Ode to Swift Enums: The View Models That Could)

Swift 枚举不仅仅是多选值的集合,它们还能作为轻量级的 ViewModel,提升代码的清晰度和可维护性。Jordan Morgan 在本文中展示了 Swift 枚举的多种高级用法,例如通过 CustomStringConvertible 提供友好的 UI 展示、结合 Identifiable 适配 SwiftUI Picker、利用 CaseIterable 遍历所有枚举值等。此外,他还探讨了如何利用关联值表示更复杂的状态(如任务进度),甚至在依赖注入和 Mock 数据 场景中发挥作用。

用 ShazamKit 实现音乐识别 (Music recognition with ShazamKit)

ShazamKit 让开发者能够轻松在 iOS 应用中集成音乐识别功能。自 iOS 17 起,该框架引入了现代并发 API,简化了数据流处理,并减少了对 AVAudioEngineSHSessionDelegate 的手动管理。在本文中,Artem Novichkov 详细讲解了如何使用 SHManagedSession 进行实时音乐匹配,并通过 SHLibrary 管理识别历史。此外,文章还提供了完整的示例代码,展示如何在 SwiftUI 中构建音乐识别界面,并扩展 SHMediaItem 以支持 Spotify 和 YouTube 搜索等功能。

OpenSwiftUI 0.1.5

上周,OpenSwiftUI 发布了 0.1.5 版本,最大的亮点是新增了对 onAppearonDisappear 的支持。尽管当前仍无法渲染视图,但在 Xcode 16.3 下,以下代码已经能够生成与 SwiftUI 完全一致的输出结果,标志着 OpenSwiftUI 在功能对齐方面迈出了重要一步。

Swift
struct OpenSwiftUIContentView: View {
  @State private var first = true
  var body: some View {
    Color(uiColor: first ? .red : .blue)
      .onAppear {
        print("View appear")
        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
          first.toggle()
        }
      }
      .onDisappear {
        print("View disappear")
      }
      .id(first)
  }
}

Harmony

Harmony 是由 Gülenay Gül 开发的开源音乐播放器应用,采用 SwiftUI、TCA 和 SharingGRDB 构建,拥有简洁优雅的 UI 以及清晰的代码结构。无论是想了解如何组织 SwiftUI 项目,还是如何利用 TCA 进行状态管理,Harmony 都是一个优秀的参考示例。此外,Gülenay 也欢迎更多开发者参与贡献,共同完善这个项目。

每周精选 Swift 与 SwiftUI 精华!