# 老司机 iOS 周报 #141 | 2020-12-21

![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) 提出。

## WWDC20

本周在周报公众号上我们推送了 2 篇 WWDC20 内参专栏内的文章，每篇都很精彩！

- [iOS 稳定性：编写会“失败”的测试](https://mp.weixin.qq.com/s/J2bZNxe5Xf9xL85ftIjG3g)
- [iOS 稳定性：更快地获得测试结果](https://mp.weixin.qq.com/s/iLmpcuFadWEekRqE3SM15w)

## 新闻

### [苹果现已推出轻 App 码](https://developer.apple.com/cn/news/?id=4c7j45dp)

[@Parsifal](https://github.com/ParsifalC)：AppClip 是今年 WWDC 的一大亮点，现在苹果已经正式推出 AppClip 码，只需将 iPhone 靠近轻 App 码或用摄像头扫描该代码，即可打开您的轻 App 并快速完成需要的任务。

### [App Store 现已提供 App 的隐私标签](https://developer.apple.com/cn/news/?id=3wann9gh)

[@Parsifal](https://github.com/ParsifalC)：上个月苹果已经要求开发者必须在 12 月 8 号之前必须完善 App Store Connect 上的新隐私信息，而现在开发者所填写的隐私信息已经能够被 App Store 上浏览，帮助其了解该 app 的隐私保护做法。

## 新手推荐

### 🌟 🐎 [iOS | 事件传递及响应链](https://juejin.cn/post/6894518925514997767)

[@J_Knight_](https://github.com/knightsj)：本文图文并茂并结合代码介绍了 iOS 中的事件传递及响应链机制：确定第一响应者以及如何通过响应链来传递事件的过程。同时也推荐本文作者的另外一篇文章：[iOS | 响应链及手势识别](https://juejin.cn/post/6905914367171100680) ：讲解了手势识别是如何通过响应链来传递事件的。

### 🐢 [iOS App Dev with SwiftUI Tutorials](https://developer.apple.com/tutorials/app-dev-training)

[@Parsifal](https://github.com/ParsifalC)：苹果官方推出的 iOS App 入门级教程，大约 4 个小时时间，让你体会如何用 SwiftUI 构建一个简单的 App。整个教程还是采用类似逐步闯关的形式进行，十分友好。

## 文章

### 🌟 🐕 [200 weeks of Swift](https://www.swiftbysundell.com/articles/200-weeks-of-swift/)

[@zvving](https://github.com/zvving)：[John Sundell](https://twitter.com/johnsundell) 是 Swift 开发者社区的知名创作者，他创建的 [Swift by Sundell](https://www.swiftbysundell.com/about/) 网站每周发布 Swift API 设计、访谈、最佳实践等优秀文章、播客。

不知不觉网站已经迎来第 200 期更新：作者在 Swift 学习过程中，常见问题的三处思考：

- 更多使用值类型，除非需要共享可变状态
- 用语义清晰的类型加强代码自注释
- 面向协议编程也有代价，建议在不同方案中寻求平衡

[Swift by Sundell](https://www.swiftbysundell.com/about/) 网站有大量精彩内容，推荐 Swift 开发者订阅。

### 🌟 🐕 [都 2021 年了，你的动画还在用 setState ？](https://juejin.cn/post/6906670385941446670)

[@CrazyCoderShi](https://github.com/CrazyCoderShi): Flutter 中想要实现一个动画效果也是极其简单的，通过动画控制器，然后修改 State 即可。但这并非正确的姿势，本文通过 AnimatedBuilder 来实现动画，并解析其源码来分析为何如此，强烈推荐.

### 🌟 🐢 [App 启动提速实践和一些想法](https://mp.weixin.qq.com/s/v2Ym9GPU4J8xCFFNYcpJhg)

[@Leo](https://github.com/leomobiledeveloper)：启动是门面，好的印象也有助于留存率提高。本文包含了 iOS 和 Android 的一些通用启动优化实践，作者从 H5 启动页、下载速度、线程调度、多线程模型等多个维度展开讲解，最后介绍了分析工具和自动化管控。一篇文章包含了 App 启动速度的方方面面，建议仔细阅读。

### 🐎 [No more [weak self], or the weird new future of delegation](https://olegdreyman.medium.com/no-more-weak-self-or-the-weird-new-future-of-delegation-f2a2745cd73)

[@xiaofei86](https://weibo.com/xuyafei86)：当我们使用闭包时总是要为了避免循环引用而使用 weak self。本文通过属性包装器将回调用带有泛型的类进行封装，使避免循环引用的职责由 API 的使用者转换到 API 的设计者身上。我们只需要将回调闭包用 @Delegate 标记就可让使用者避免使用 weak self，例如：
```swift
@Delegated var didUpdate: (String) -> Void

textField.$didUpdate.delegate(to: self) { (self, text) in
    self.label.text = text
}
```
但由于 Swift 泛型的限制 1 个属性包装器只能处理固定数量的返回参数，所以作者同时编写了开源库 [Delegated](https://github.com/dreymonde/Delegated) 提供 @Delegate0、@Delegate1、@Delegate2 等多个属性包装器来支持不同参数数量的闭包。有兴趣的同学可以阅读原文了解。

### 🐕 [The future of SwiftUI navigation (?)](https://fivestars.blog/swiftui/programmatic-navigation.html)

[@极速男孩](https://github.com/ztlyyznf001)：SwiftUI 中没有了 ViewController 中 present 的方法，而是用了 NavigationLink 来替代。但是 NavigationLink 也存在着一些限制，比如在导航是向目标 view 传一个 dynamic 的值比较麻烦，然后 NavigationLink 声明的时候需要有一个 view 。这篇文章主要介绍了如何避免这些 NavigationLink 的限制。首先我们可以通过绑定一个状态或者一个 EmptyView 来解决 NavigationLink 需要一个 view 的问题。然后我们可以通过绑定一个对象的标识而不是 Bool 或者 Hashable 的值来解决向目标 view 中传值的问题。

### 🐕 [iOS 编译速度如何稳定提高 10 倍以上之一](https://juejin.cn/post/6903407900006449160)

[@红纸](https://github.com/nianran)：本文主要阐述了美柚团队在编译包上二进制化跟编译文件缓存上的探索。主要阐述了如下几种尝试方向：

1. 利用 CCache 缓存优化编译产物，但是命中率低。
2. cocoapods-binary 插件，在 pod install 的 pre_install hook 中拦截并在当前的 Pods 目录下打包二进制文件，本质上只是编译前移，还是会拖慢 pod install 速度。
3. cocoapods-bin 双私有源，定制化两份源文件，一份源管理源代码、一份源管理静态库。具有原生 Cocoapods 的交互体验。

美柚团队在 cocoapods-bin 的基础上客制化 [cocoapods-imy-bin](https://github.com/MeetYouDevs/cocoapods-imy-bin) 插件。其插件具有以下特征点：

1. 无入侵、无感知、不影响现有业务
2. 支持 Swift 二进制化
3. 支持 use_frameworks!
4. 轻量，不受耦合或组件化的影响
5. 完全自动化，一键使用、无需手动操作，包含完整的 server 体系一条龙服务
6. 含有二进制源码调试功能

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

### 🐎 [How expensive is DateFormatter](https://sarunw.com/posts/how-expensive-is-dateformatter/)

[@水水](https://www.xuyanlan.com):相信大部分读者都知道创建 DateFormatter 的操作有非常昂贵的代价，但是大部分读者可能并不清楚到底它有多慢，哪个部分"贵"，我们将在本文中一起找出答案。

### 🐕 [Apple Silicon(苹果芯片)从 DTK 到 M1 Mac 的入门总结](https://juejin.cn/post/6903091283204833287)

[@老驴](https://www.weibo.com/6090610445)：Apple 在今年 6 月的 WWDC 上正式宣告了从 Intel 到 Apple Silicon 为期两年的转变，这不仅仅是苹果产品的转变，更是整个行业从 x86 转向 ARM 的序章。本文的作者就帮你梳理了一下从开发者套件到 M1 芯片的最终产品的种种。

### 🐕 [M1 芯片有何不同？](https://mp.weixin.qq.com/s/Krmx_mYpDdRGKzN3zs3mYw)

[@JonyFang](https://github.com/JonyFang)：本篇主要介绍了 M1 芯片与其他芯片的不同之处、优秀的点及存在的问题。分别从如下几个方面进行了分析： 

- M1 芯片与 CPU 的关系
- 苹果如何做到的统一内存架构（UMA）
- M1 用到了先进的 5 纳米制程&惊人的 160 亿个晶体管
- M1 存在哪些问题

对于苹果来说，未来无疑将会长期进行大量的投入来对 M 系列芯片进行迭代，且其自有生态也保证了能够反哺 M 系列芯片的研发。也期待未来更为完善的 M 系列芯片。

### 🚧🐕 [Binary Size Woes](https://medium.com/nerd-for-tech/binary-size-woes-acb5d96f058a)

[@四娘](https://kemchenj.github.io/)：作为上一期 [Uber 工程师亲述使用 Swift 重写 App 的经历](https://github.com/SwiftOldDriver/iOS-Weekly/blob/master/Reports/2020/%23140-2020.12.14.md#-uber-工程师亲述使用-swift-重写-app-的惨痛经历)的后续，有另外一位工程师出来介绍他们在缩减 Binary Size 方面做的努力，从与苹果的沟通，到工程方面的努力，包括编译参数的调优，追踪每一个 Pull Request 对于 Binary Size 的影响等等。

## 代码

### [Motion](https://github.com/b3ll/Motion)

[@Damien](https://github.com/ZengyiMa)：Motion 是一个完全用 Swift 编写的动画引擎，用于在 iOS，macOS 和 tvOS 进行动画和交互，并且完全支持 Apple 的 SIMD 特性。 Motion 可以轻松的创建动画（如弹簧，衰减等特性动画），也可以与手势识别相关的功能一起合作，以实现尽可能流畅和令人愉悦的交互。需要的做出精美的交互动画的同学值得尝试一下。

## 赞助者

虚位以待..

**非常感谢以上赞助者的支持，如果你也有赞助我们的兴趣，欢迎添加微信 iTDriverr 哦~**

## 内推

老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。

如果你想**找工作**，点这里：https://www.yuque.com/iosalliance/article/bhutav

如果你想**招人**，点这里：https://www.yuque.com/iosalliance/article/ycyhf3

当然，也欢迎你关注我们每一期的周报，我们会在每期周报底部及时更新编辑内推岗位。

## 关注我们

我们开通了公众号，每期发布时公众号（LSJCoding）会推送消息，欢迎关注。

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