# 老司机 iOS 周报 #280 | 2024-03-11

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

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

## 新闻

### [Privacy updates for App Store submissions](https://developer.apple.com/news/?id=3d8a9yyh)

[Privacy manifests and signatures](https://developer.apple.com/support/third-party-SDK-requirements/) 的 deadline 来了，5 月 1 日。目前大部分知名第三方库都已经完成了适配，例如：[SDWebImage](https://github.com/SDWebImage/SDWebImage/blob/master/SDWebImage/Resources/PrivacyInfo.xcprivacy)、[FMDB](https://github.com/ccgus/fmdb/blob/master/privacy/PrivacyInfo.xcprivacy)、[Protobuf](https://github.com/protocolbuffers/protobuf/blob/main/PrivacyInfo.xcprivacy)、[SnapKit](https://github.com/SnapKit/SnapKit/blob/develop/Sources/PrivacyInfo.xcprivacy) 等，但也有部分如：MBProgressHU、Starscream 等年久失修可能得自己处理下。

##  Developer - 设计开发加速器

### [Apple Vision Pro 开发者实验室 与 探索《人机界面指南》](https://developer.apple.com/events/view/upcoming-events?q=Shanghai)

上海的 Vision Pro 的开发实验室即将迎来多场活动，[3 月 27 日](https://developer.apple.com/events/view/U56UR4S32Y/dashboard) 与 [4 月 24 日](https://developer.apple.com/events/view/H44MV68G45/dashboard) 的线下实验室，以及 4 月 10 日的 [1 on 1 线上咨询](https://developer.apple.com/events/view/NLYY4Q2N6Y/dashboard)。

4 月 2 日还有[探索《人机界面指南》](https://developer.apple.com/events/view/5758Q34VL9/dashboard) 的活动。

还没有亲自体验过 Vision Pro 的开发者千万不要错过本次活动。

## 新手推荐 

### [The power of inout parameters](https://danielsaidi.com/blog/2024/02/18/the-power-of-inout-parameters)

[@zoeGuo](https://github.com/zoeGuo)：Swift 函数参数是常量，这意味着不能在函数内部修改入参的值。将参数标记为 inout 实际是将入参值引用，从而实现在函数内更改其值。文中举例了富文本 context 跟随 textView 的各属性值变化的例子说明使用 inout 参数可以减少重复表意的代码、使代码更简洁。

## 文章

### 🐕 [Why Ollie is moving away from SwiftUI to UIKit](https://medium.com/goodones/why-ollie-is-moving-away-from-swiftui-to-uikit-cfdefe918d1c)

[@JonyFang](https://github.com/JonyFang): 本文描述了该团队在 SwiftUI 应用过程中经历了一系列关于 SwiftUI 和 Swift 并发的问题，最终决定从 SwiftUI 迁移到 UIKit。他们指出 SwiftUI 的抽象和不确定性给开发带来了更多的开发成本，在处理复杂的业务逻辑和多线程时问题更为明显。SwiftUI 的"魔法"和 AttributeGraph 的不确定表现让 debug 变得困难。开发过程中 Swift 并发的死锁问题也让开发者头疼，而其异步执行的顺序问题使得调试变得复杂。

作者强调了 SwiftUI 可能正在经历第二系统效应（second-system effect），第二系统效应可能造成软件专案计划过度设计，产生太多变数，过度复杂，无法达成期待，并因而失败。他们解释了在使用 SwiftUI 和 Swift 并发时的一些错误实践，包括对 MVVM 和对 SwiftUI 内部属性的误用。他们还提到了对 Combine 的迁移以及将重型操作移到显式调度队列的决策。

为了解决问题，团队决定迁移到 UIKit，并举例说明了一个使用 UIKitCollectionView 的案例在性能上远远超过 SwiftUI 版本。

### 🐕 [How to determine where tasks and async functions run in Swift?](https://www.donnywals.com/how-to-determine-where-tasks-and-async-functions-run-in-swift/)

[@Kyle-Ye](https://github.com/Kyle-Ye): 本文解释了 Swift `Task` 和异步函数的运行规则，以及它们和 GCD 心智规则的不同之处。作者首先介绍了不同的 `Task` 类型 - 分离 Task 和非结构化 Task，其次重点解释了 Swift 对于不同 Task 的调度规则。

如果上下文被 `@MainActor` 或其他全局 `Actor` 关联或隔离，则创建的非结构化 `Task` 会在对应 `Actor` 的 `executor` 中执行，否则会被调度到默认的全局 `executor` 中执行。

注意某些协议也可能携带 `@MainActor` 约束以及我们可以在测试代码中使用 `MainActor.assertIsolated(_:)` 来进行运行时的 `@MainActor` 隔离检查。


### [C++ 常见避坑指南](https://mp.weixin.qq.com/s/ivmOl-qGALnHEVbwKANiug)

[@莲叔](https://github.com/aaaron7)：腾讯是大厂中 C++ 使用度最高的公司，很长一段时间几乎所有的后端服务都是用 C++ 开发完成的。本篇文章介绍与总结了 C++ 在大规模工程开发中最常见的问题，非常有价值。新手使用 C++ 往往很容易被淹没在无数的语言细节里，同样的逻辑也会有多种写法，这个时候如果有一个身经百战的前辈出来给你划重点，那练级效率必然会事半功倍。这篇文章就给我这样的感觉，推荐给需要在工作中使用 C++ 的技术同学阅读。


### 🐎 [Everything you need to know about Swift 5.10](https://www.donnywals.com/everything-you-need-to-know-about-swift-5-10/)

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：伴随着 iOS 17.4 和 iPadOS 17.4 的发布，Apple 推出了 Swift 5.10，这一版本在并发性方面取得了显著的进步。Swift 5.10 主要针对 Swift Concurrency 的数据安全功能进行了改进，特别是在严格并发检查方面。通过增强并发检查，Swift 5.10 现在能够更准确地识别并标记出不安全的代码，从而帮助开发者在编写并发代码时避免数据竞争和其他线程安全问题。Swift 5.10 还引入了 SE-0412 提案，该提案限制了全局变量的并发访问，进一步提高了 Swift 在编译时防范数据争用的能力。这意味着开发者在编写涉及共享状态的代码时，需要更加明确地考虑其并发安全性。


### 🐢 [The power of self-sufficient features](https://www.swiftindepth.com/articles/self-sufficient-features/)

[@享耳先森](https://github.com/iblacksun)：一个功能最好是相对独立，尽量减少对外部的依赖，本文介绍了 `self-sufficient features` 的几个原则：
1. 自身加载必须的数据，而不靠外部传入
2. 内部处理各种错误，而不向外传递
3. 不要依赖或修改堆栈

### 🐕 [How to use VariadicView, SwiftUI's Private View API ](https://www.emergetools.com/blog/posts/how-to-use-variadic-view)

[@Cooper Chen](https://github.com/cjlcooper)：本文介绍了 SwiftUI 中私有视图 API 称为 VariadicView，，通过枚举 _VariadicView 是这个类的入口，它包括其他类型，例如_VariadicView_MultiViewRoot 和_VariadicView. tree 等等，文章介绍了如何使用 VariadicView 以及其安全性，对于 SwiftUI 相关开发有不错的实用性。

### 🐕 [High Performance Swift Apps](https://jacobbartlett.substack.com/p/high-performance-swift-apps)

[@DylanYang](https://github.com/Dylan19Yang)：本文作者从自己的 App 入手，详细讲述了如何着手优化 App 的性能，其中包含了问题分析、Instruments 的简单使用说明以及最终的代码实践，非常适合新人入门。其中作者的一个观点也是非常令人赞同：应该先找到问题，聚焦在真正的瓶颈上，避免在琐碎的点上投入太多精力。

## 代码

### 🐢 [ConcurrencyRecipes](https://github.com/mattmassicotte/ConcurrencyRecipes)

[@AidenRao](https://weibo.com/AidenRao)：作者表示 Swift Concurrency 很难用，所以整理和记录了一些使用 Swift Concurrency 遇到的问题和解决方案，并欢迎大家一起共建。


## 内推

重新开始更新「iOS 靠谱内推专题」，整理了最近明确在招人的岗位，供大家参考

具体信息请移步：https://www.yuque.com/iosalliance/article/bhutav 进行查看（如有招聘需求请联系 iTDriverr）

## 关注我们

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

**关注有礼，关注【老司机技术周报】，回复「2023」，领取 2023 及往年内参**

![](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）
