# 老司机 iOS 周报 #220 | 2022-10-24

![ios-weekly](https://github.com/SwiftOldDriver/iOS-Weekly/blob/master/assets/ios-weekly.png?raw=true)
老司机 iOS 周报，只为你呈现有价值的信息。

你也可以为这个项目出一份力，如果发现有价值的信息、文章、工具等可以到 [Issues](https://github.com/SwiftOldDriver/iOS-Weekly/issues) 里提给我们，我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 [Issues](https://github.com/SwiftOldDriver/iOS-Weekly/issues) 提出。

## 文章

### 🐢 [A Possible Vision for Macros in Swift](https://forums.swift.org/t/a-possible-vision-for-macros-in-swift/60900)

[@kemchenj](https://kemchenj.github.io)：前一段时间 Swift 团队决定将编译器的 Parser 改为使用 Swift 实现，并且将这一部分功能内置到 SwiftSyntax 里。

这意味着 **Swift 成为了语法 API 的一等公民**，我们可以很便捷地在 Swift 代码里里访问和修改自身（源代码），更进一步地说，我们可以通过代码去编写代码。

如果把这个功能集成到编译器和语法里，就成了我们熟知的**宏 (macro)**。趁着这个机会，Swift 团队思考了后续如何借助这套 API，提供宏的实现，并且分享了初步的设计思路到论坛里，希望大家可以一起参与讨论。

以往很多硬编码在编译器里的功能都可以改为通过宏系统进行实现，例如 `Equatable`/`Hashable` 的实现自动合成等等：

```swift
extension Equatable {
  macro func ==(lhs: Self, rhs: Self) -> Bool
}
```

### 🐎 [Which Collection?](https://khanlou.com/2022/10/some-collections/)

[@Smallfly](https://github.com/iostalks)：集合（Collection）是编程语言常用的类型，Swift 集合是值类型的，对于复杂的集合数据，频繁拷贝可能会带来性能问题。本文通过一个数独算法，介绍如何对数组做优化，主要利用了 `some` 关键字配合 Swift 5.7 协议支持关联类型的新特性实现。想了解更多请参考 [SE-0346](https://github.com/apple/swift-evolution/blob/main/proposals/0346-light-weight-same-type-syntax.md)。

### 🐕 [Xcode 中使用 SPM 和 Build Configuration 的一些坑](https://onevcat.com/2022/10/spm-in-xcode/)

[@红纸](https://github.com/nianran)：经喵神的相关测试发现，在 Xcode 中使用 SPM 的包编译时将参照 Build Configuration 的名字，自动选择使用 DEBUG 还是 RELEASE 模式来编译，这将导致编译宏、编译配置等一系列因素影响最终的二进制产物。

规则：若名字里包含有 Debug 或者 Development（不区分大小写）则选择 DEBUG 模式，反之则选择 RELEASE 模式。

### 🐕 [iOS 灵动岛开发实践](https://juejin.cn/post/7153236337074634788)

[@anotheren](https://github.com/anotheren)：灵动岛是 Apple 为 iPhone 14 Pro 系列带来的下一代交互体验。在 iOS 16.1 中，相关 API 已向开发者开放，并仅提供了 SwiftUI 版本的接口。本文从电商角度，带来了灵动岛开发的入门实践。但是并非所有功能都适合在灵动岛上展示，推荐核对 Apple 的人机交互设计指南中的 [Live Activities](https://developer.apple.com/design/human-interface-guidelines/components/system-experiences/live-activities) 部分。

### 🐢 [Swift Concurrency – Things They Don’t Tell You](https://wojciechkulik.pl/ios/swift-concurrency-things-they-dont-tell-you)

[@Cooper Chen](https://github.com/cjlcooper)：Swift Concurrency 提供了一种非常好的编写异步代码的方法，同时它也被宣传为使用安全。然而不幸的是 Swift Concurrency 编程有很多陷阱，而且编译器不会检查所有东西
- 如果使用 async 关键字，确保在后台线程上调用，否则需要添加 @MainActor 属性
- Swift Actor 不能保证在使用过程中避免数据竞争，不保证异步方法在调用另一个方法之前会被完全处理
- 避免将锁和信号量等经典的同步方法与 Swift Concurrency 混合使用
- 设置 Task 优先级，避免在单个队列上分派所有内容
- 避免在 Task 中进行繁重的同步工作，例如当需要像图像处理这样的繁重工作时，请使用自定义 DispatchQueue
- 必要时请使用 await Task.yield() 允许更频繁地切换任务

## 代码

### [灵动岛开发示例代码](https://github.com/jordibruin/Dynamic-Islands)

[@anotheren](https://github.com/anotheren)：这是一份灵动岛开发的示例代码，包含了多个实例的展示，你可以结合上面灵动岛开发实践一起食用更佳。

## 音视频

### [Swift 视频教程 ChaoCode](https://space.bilibili.com/1911023449/video)

[@EyreFree](https://github.com/EyreFree)：Swift 视频教程 ChaoCode 从 [油管](https://www.youtube.com/c/ChaoCode/featured) 入驻 B 站，从基础的 Swift 语法到中级 Swift 内容、 SwiftUI、用 Swift 制作完整 App 等都有，比较适合入门学习 Swift，感兴趣的朋友可以关注。

> 由 [KeithBird](https://github.com/KeithBird) 推荐

## 摸鱼周报

[@摸鱼周报 #72](https://mp.weixin.qq.com/s/WUVAHbJe_dmA-DVFXpF2Qw)：第 72 期摸鱼周报来了，一起来看下本期概要：

* 本期话题：1024 程序员节在各个技术网站已经开始预热，有不少奖品可以捞一捞；App Store 现已开放 iOS 16.1 和 iPadOS 16.1 App 提交
* 本周学习：当设置 `UIImageView` 高亮时，会暂停当前的动画；Xcode 14 编译包在 iOS 12.2 以下设备崩溃的解决方案
* 内容推荐：灵动岛有很多玩法还待探索，本期推荐一些相关文章
* 摸一下鱼：CleverToolKit：iOS 开发者辅助工具，页面简洁，体积小巧。目前包含 json2model 功能。

## 关注我们

我们是「老司机技术周报」，一个持续追求精品 iOS 内容的技术公众号，欢迎关注。

**关注有礼，关注【老司机技术周报】，回复「2021」，领取 2017/2018/2019/2020 内参**

![](https://github.com/SwiftOldDriver/iOS-Weekly/blob/master/assets/qrcode_for_wechat.jpg?raw=true)

同时也支持了 RSS 订阅：https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。

## 说明

🚧 表示需某工具，🌟 表示编辑推荐

预计阅读时间：🐎 很快就能读完（1 - 10 mins）；🐕 中等 （10 - 20 mins）；🐢 慢（20+ mins）
