# 老司机 iOS 周报 #100 | 2020-02-10

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

## 新手推荐

### 🐎 [Enumerating elements in ForEach](https://oleb.net/2020/foreach-enumerated/)

[@looping](https://github.com/looping)：本文介绍了如何通过 SwiftUI 的 ForEach 来遍历展示列表，并对列表元素进行编号。作者记录了对这部分代码进行重构优化的整个过程，使用了 key-path-based 写法让代码变得清晰易懂，是一份不错的学习优化代码的材料。

### 🐎 [iOS中编写高效能结构体的7个要点](https://www.jianshu.com/p/1369508e477d)

[@极速男孩](https://github.com/looping)：本文通过介绍在内存中一个结构体是如何被存放和使用的，来介绍在 iOS 中定义一个结构体有哪些需要注意的地方。

## 文章

### 🌟🐕[2019年终总结](https://mp.weixin.qq.com/s/VtWeOJj6SeQ7yzNL9ZMFPA)

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：一篇迟来的年终总结，作者从5个方面概括了自己一年的收益和变化：

- 技术&职场
- 投资
- 读书
- 生活
- 2020 展望

读完觉得很受触动，时间对每个人都是有限的，但是每个人用来做的事却不尽相同。作为技术人员，在技术道路上不断前进之外，似乎也有必要在其他方向上多有涉猎，这是个见仁见智的问题。相信各位读者会有自己的感受体会。

### 🌟🐕🚧 [用 struct 还是 class？让 Swift-NIO 的开发者来告诉你](https://www.dotconferences.com/2019/01/johannes-weiss-high-performance-systems-in-swift)

[@五子棋](https://satanwoo.github.io)：稍微了解 Swift 的同学都知道 Swift Community 比较推崇使用 Struct，因为它是一种值语义，可以确保你的程序不会被各种 Side Effect 造成奇怪的影响。但本文的作者在开发 SwiftNIO 的时候发现在函数传参数的过程中 Struct 类型参数的性能要慢于 Class 类型，因此就深入研究了一番。同时，作者提出了一种 Struct 中嵌套 Class 并配合 COW 方式的设计，既能提升性能，又能维持值语义，是一篇适合 Swift 开发者的佳作。

### 🐕 [@](https://nshipster.com/at-compiler-directives/)

[@EyreFree](https://weibo.com/eyrefree777)：Mattt 大神新作，以新手入门的视角列举并介绍了 Objective-C 中 `@` 符号开头的一系列指令，同时对它们的设计哲学做了简单描述（顺便黑了一下 Lisp）。

参考：[中文翻译链接](https://nshipster.cn/at-compiler-directives/)

### 🌟🐕 [Binary Frameworks in Swift](https://pspdfkit.com/blog/2018/binary-frameworks-swift)

[@四娘](https://kemchenj.github.io)：PSPDFKit 从一个服务商的角度介绍了 Swift 二进制 SDK 分发的细节，包括了 ABI 稳定的含义和开发内容，以时间线的形式给我们介绍了整个开发过程。

### 🌟🐢 [为什么 SwiftPM 的开发进度比 Cocoapods 慢那么多？](https://artsy.github.io/blog/2018/12/21/why-is-swiftpm-taking-so-long/)

[@享耳先森](https://github.com/iblacksun)：CocoaPods 开发者 [Orta Therox](https://github.com/orta) 写了篇文章分析为什么 SwiftPM 开发速度比 CocoaPods 慢？总的来说，两者所关注的层级不一样：SwiftPM 需要关注全链路的编译，需要支持 Linux 等系统，脱离了 Xcode；而 CocoaPods 是基于 Xcode 之上的，其产物是给 Xcode 用的，只需关注 macOS 平台。

### 🐎[再见，整洁代码（译）](https://overreacted.io/zh-hans/goodbye-clean-code/)

[@JimQ](https://github.com/waz0820)：这又是一篇对“代码洁癖者”的“劝你三思”的文章。正如作者文中所说，对“整洁代码”的沉迷、好于“消除重复代码”，是我们大多数开发者都会经历的阶段，但作为开发者不应仅仅关注于“整洁”，还要把一切需要权衡的因素考虑在内，考虑到对团队协作效率的影响，是否能够应付需求变化，以及这种行为对整个工程的影响等等。

### 🐕 [TopLevelEncoder and TopLevelDecoder in Combine](https://oleb.net/2020/topleveldecoder/)

[@anotheren](https://github.com/anotheren)：在使用 Codable 这组协议时，你可能会发现已经内置于标准库中的 [`JSONDecoder`](https://developer.apple.com/documentation/foundation/jsondecoder) 和 [`PropertyListDecoder`](https://developer.apple.com/documentation/foundation/propertylistdecoder) 并未遵从于一个统一用于描述顶级解码器的协议，而编解码的起点与结果也并非仅有 `Data` 这一种而已。于是 `Combine` 中，为此定义了 [`TopLevelDecoder`](https://developer.apple.com/documentation/combine/topleveldecoder) 和 [`TopLevelEncoder`](https://developer.apple.com/documentation/combine/toplevelencoder) 协议来统一描述顶级的编解码器。本文以实际案例出发，简述了这组协议存在的缘由。在 Swift 未来的某一个版本中，它们会以不破坏 ABI 稳定的方式加入标准库。

## 代码

### [Barber](https://github.com/michaeleisel/barber)

[@老驴](https://www.weibo.com/6090610445)：此 framework 用了点投机取巧的方式来加快项目开发中增量编译的速度问题，基本思路是去掉 AppDelegate，转而为每一个大 ViewController 各自建立自己的 dependency，这样在针对某个 ViewController 做开发的时候，可以避免小改动就导致全部重新编译的情况。

其实个人并不是很推荐在正儿八经的项目中使用这样的 framework，不过，这样的思路倒是可以参考一下。

### [Pure-Swift-UI](https://github.com/CodeSlicing/pure-swift-ui)

[@AidenRao](https://weibo.com/AidenRao)：PureSwiftUI 是一个辅助 SwiftUI 的工具类，用于优化编写 SwiftUI 的体验。
- 删除了大量的显示参数，通过更能表达含义的接口，将参数配置组合起来，使代码结构更清晰。
- 只要你的变量是 Int，Double，Float，或者 CGFloat，PureSwiftUI 上都能混合着使用。
- 通过修改 geometryReader 的备份 GeometryProxy，可以不影响 geometryReader 布局。
- offsetToPosition 修饰符，可以将 View 的位置设置为任何坐标空间内的绝对位置。
- 条件修饰符替代三目运算符，根据状态有条件地对视图进行样式配置。
- SF Symbols 使用常量，替代字符串调用。


## 内推

> **回响科技招人啦，求简历：**
> - 回响科技研发中心长期招聘 iOS 开发工程师、Android 开发工程师、Go 开发工程师/架构师、前端开发工程师，另有产品、运营、销售等非技术部门职位也欢迎投递！
> - 坐标上海，主营业务为潮流文化产品交易平台&社区，团队技术氛围良好，对新技术接受程度高，对各类能够提升团队开发效率的工具/方法持开放态度。
> - 简历以【姓名+投递岗位+手机号】格式发送至 eyrefree@eyrefree.org 或者直接加微信 `EyreFree`。

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

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

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

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

## 关注我们

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

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