# 老司机 iOS 周报 #43 | 2018-11-12

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

## 小专栏

### [From Swift To C++](https://xiaozhuanlan.com/topic/7216403859)

来自微信团队的周报编辑芒果最新出炉的一篇文章。这篇文章按照编程范式（programming paradigm）来组织脉络，从一个客户端工程师的角度来品味和对比这 Swift 和 C++ 两门语言。如果你也在或者即将同时把 Swift 和 C++ 当做主流编程语言，那么这篇文章你绝对值得一看。

## 新闻

### [适用于触控问题的 iPhone X 显示屏模块更换计划](https://www.apple.com/cn/support/iphone-x-display-module-replacement-program/)

号外！号外！继“降频门”事件引起的 218 元换电池服务后，苹果又出免费更换 iPhone X 显示屏服务了。只要你的 iPhone X 经过测试满足以下两个问题，则苹果会替你免费更换显示屏。

- 显示屏或显示屏的一部分不响应或间歇响应触控操作。
- 即使没有进行触控操作，显示屏也会作出反应。

另外友情提醒，218 元换电池只剩最后一个半月了，还没换的小伙伴抓紧上，绝对能让你的老设备焕然一新！

## 文章

### 🌟 🐕 [Language Server Protocol](https://nshipster.com/language-server-protocol/)

前段时间 Apple Swift 团队在 Swift Forum 上宣布他们会对 Swift 和 C 系列语言（C/C++/ObjC）增加 LSP （Language Server Protocol）支持。这对于饱受 Xcode 折磨的开发者来说是个极大的利好，意味着在这之后可以有更多的第三方 IDE 支持。

Matt 的这篇文章，解释了什么是 LSP，LSP 是怎么工作的，以及潜在的可能带来的好处。

虽然 Swift 支持 LSP 的具体时间表到现在还没有放出来，但是受苦于 Xcode 的大伙们也算是有点盼头了。

### 🌟 🐎 Tricks & treats to make UI testing less terrifying
[part1](https://blog.novoda.com/ui-testing-part-1/)、[part2](https://blog.novoda.com/ui-testing-part-2/)、[part3](https://blog.novoda.com/ui-testing-part-3/)

自动化测试，尤其是 UI 的自动化测试，对于国内大部分的开发者应该都是“只闻其声未见其人”的感觉，知道有这么个事儿，但基本都没怎么实践过。这一系列文章系统性的讨论了 UI 自动化测试的最佳实践。从如何标记 UI 元素到如何访问，最后在第三部分还探讨了一种编写 UI 测试的“设计模式”，名叫 PageObject 的编程模型，来提升 UI 测试代码的可维护性。

### 🐎 [Stephen King's Advice To Software Developers](https://www.mokacoding.com/blog/stephen-king-advice-to-software-developers/)

斯蒂芬·金，《肖申克的救赎》的作者。他曾在《On Writing》一书说，讲述了他的写作经验。学习技巧基本相通，因此本文作者将斯蒂芬·金的经验融合到软件开发实例中。
1. 多输入，多输出
    - 多输入：多看源码，`CodeReview`，博客，书籍，如无从做起，可多关注**老司机周报**。
    - 多输出：对于想掌握的技巧，多进行刻意练习。
2. 避免分心
    - 规划时间，**固定**的时间做**固定**的事情，效率更高。
    - 寻找**专门的空间**和可以集中精神的 **2 个小时**。
3. 闭门，开门
    - 专注开发完成后（闭门），接受 `CodeReview` 或者开源，吸纳更多的意见进行优化（开门）。
4. 杀掉你的所爱
    - 每次优化，果断删掉你自豪但无用的代码，炫技不如贴合业务。
5. 花时间
    - 没有捷径，务必**坚持**（但是要注意**学习技巧**）。

### 🚧 🐕 [How to remove duplication from Swift tests with helper functions](https://www.mokacoding.com/blog/how-to-remove-duplication-from-swift-tests-with-helper-functions/)

对于 XCTest 的单元测试来说，提取重复代码对于开发者而言并不友好，可能会出现如下几种问题：

 1. 执行过程中，Xcode 的断言函数停止在了提取函数内部。
 2. 多个单元测试同时报错时，需要展开错误信息才能了解到具体信息。

为了解决如上几个问题，作者巧妙的运用了 Swift 中 `XCAssert` 函数的另外两个入参 `file` 和 `line`，来传递辅助函数调用时的文件和行号，这样 Xcode 就能够帮助你将错误信息正确提示到辅助函数调用的地方。

### 🐕 [Keeping your code clean](https://www.netguru.co/codestories/keeping-your-code-clean)

写得一手好字，对于普通人来讲是一个很好的加分项，而是否写得一手简洁漂亮的代码则对于我们开发者来说更为重要。招聘单位往往对应聘人的代码风格都会有一定要求。本文分享了如何写得一手好代码的几个小技巧，很值得大家关注，并在平常开发中重视起来。

- LOC（Lines Of Code）：代码应该足够精简，函数是最小的执行单元，避免冗长的代码集中在一个函数实现上。
- 正确的缩进：不管你是 “Tab” 党还是 “空格” 党，合适的缩进能让你的代码排版更加整齐，让人读起来更加舒适。
- 标准的命名：虽然命名一直是程序员的难题，但我们仍然需要能够很好的名字来提高我们代码可读性。
- 变量和函数的声明：在合适的地方做声明，按照功能进行分组。
- 代码风格：每个团队都应该有一套代码规范，来统一团队成员的代码风格。

另外，该作者还在最后为我们推荐了几个 Lint 的工具，可以帮助我们自动化代码规范审核，如 **SonarQube**、**Tailor** 以及 **SwiftLint**。

### 🐕 [String’s ABI and UTF-8](https://forums.swift.org/t/string-s-abi-and-utf-8/17676)

近日，Michael Ilseman 在 Swift 社区论坛发文 `String’s ABI and UTF-8` 表示 String ABI 相关改动已提交到 master 分支。具体来说，这是底层实现的一次显著改动(这些改动在 API 层面无任何影响)，其中最主要的一点就是原生 Swift 字符串会统一使用 UTF-8 进行存储（在内存里），而之前是根据内容选择 ASCII 或者 UTF-16 进行存储。

文章还特地提到：传统意义上中文字符串是 UTF-8 性能最差的场景（需对多个 UTF-8 编码进行重排合并得到 Unicode 码位），得益于现代 CPU 的改进，这些已不再是问题。

### 🐢 [Result\<T\> 还是 Result\<T, E: Error\>](https://onevcat.com/2018/10/swift-result-error/)

API 的错误处理一直是 Cocoa 做的不好的一部分。到了 Swift 时代，我们有了更好用的 enum，可以帮助我们统一 Data 与 Error 的封装。如果你常用 Alamofire，一定对它的 `Result<T>` 非常熟悉，对于错误，它仅要求满足 `Swift.Error`。但是很多时候处理这个空协议依旧不是最方便。于是又有人提出了 `Result<T, E: Error>` 来指定错误类型，大部分情况下你会在这里定义一个 enum 来穷举所有可能的错误（注意这里的错误是 `Error` 而非 `Swift.Error`）。喵神在文中详细对比了这两种方式的利弊。

当然，官方不可能对这一不足置之不理，相关的提案 [SE-0235: Add Result to the Standard Library](https://github.com/apple/swift-evolution/blob/master/proposals/0235-add-result.md) 本周已经在讨论中，相信结果很快就会出来，让我们拭目以待。

### 🐢  [KVC/KVO 总结](https://juejin.im/post/5be25b256fb9a04a0279d217)

对 KVC / KVO 做了到位的总结和代码示例。相信对想要详细了解或使用 KVC / KVO 的同学会有所帮助。

KVC
- Key-Value Coding基本原则
- 访问对象属性
- 访问集合属性
- 访问者搜索模式

KVO
- 注册KVO
- 兼容KVO
- 注册从属keys
- Key-Value Observing 的实现细节

### 🐢 [Category 特性在 iOS 组件化中的应用与管控](https://mp.weixin.qq.com/s/5ucpVa6ku4b9_pfMP9CqlQ)

关于组件化，在业界的文章和讨论已经很多了。但组件化其实是一个比较大的工程化问题，对于想要使用和已经采用组件化进行开发的团队来说，对于实施组件化的很多细节，其实很多文章并没有说的很清晰。本文主要围绕组件分层通信解耦的机制，先后列举了常见的几种方案对比，以及美团所采用的方案：Category+NSInvocation 和 CategoryCoverOrigin。对于这两个相对陌生一些的方案，文中也有一定的介绍，并且写了实际运用的代码，对此有兴趣的同学推荐可以认真看一下本文。最后，Category 的使用笔者一向认为需要比较慎重，否则往往会带来更坏的效果，至于采用哪种方案，就看大家自己的抉择了。这里并没有打太极的意思，而是对于组件分层通信，怎么做、是否要做到如此，以及各种方案所带来的代码量的增加和后期的维护成本是否值得，不同的团队也会有不同的见解。
    
### 🐕 [Void](https://nshipster.com/void/)

NSHipster 介绍了很多和 Nothingness 相关的内容。这篇文章主要介绍的是 Swift 中的 Void。文章内容依旧是 Mattt 大神的写作三部曲：

- Void 在标准库中的运用
  
    描述了 Swift 标准库在设计 ExpressibleByNilLiteral 的时候，如何巧妙的运用 Void 避免了和默认 init 冲突的情况。

- Void 一些被忽略的细节

    比如 Void 是一个 non-nominal 类型，如何在无法拓展的情况下如何相互比较、一些自相矛盾的写法等
    
- Void 实际开发中的秒用

    以网络请求为例，在使用 Void 的情况下，巧妙的把 `completion(.success(()))` 改成了 `completion(.success)`

### 🐎 [Swift Tip: Lightweight Observation](https://www.objc.io/blog/2018/11/06/lightweight-observation/)

对于静态视图结构和动态数据，我们可以使用内建的 `didSet` 属性观察器来观察数据的变更，并对应更新视图。这项技术的优势就在于简单性：不需要引入响应式框架、KVO 或其他东西。这篇文章用一个实际的例子演示了具体的做法。

### 🐕 [Swift 5 and ABI stability](https://theswiftdev.com/2018/11/06/swift-5-and-abi-stability/)

Swift 5 的分支最近已经准备要合并到主干了，这一次合并意味着 ABI 在 Release 之前不会有大改动，并且在未来版本保持 ABI 的向后兼容性。

所以最近在 Swift 论坛上也能看到核心团队加快节奏在调整精简标准库的 API，包括加入 [Contiguous Collection Protocols](https://forums.swift.org/t/contiguous-collection-protocols/17875) 确立数组内存布局以便优化排序等操作，去除掉 [Sequence.SubSequence](https://forums.swift.org/t/se-0234-removing-sequence-subsequence/17750) 以便提升数组切片效率等等。

如果你还不了解 ABI 相关的内容，那么可以看看这篇文章，了解一下 ABI 稳定对我们日常开发的影响。

### 🐢 [【译】给 iOS 开发者介绍 Flutter](http://ie8384.com/blog/index.php/archives/1603/)

本文是 Flutter for iOS 官方指南的翻译。iOS 知识和技能对 Flutter 开发非常有价值，如果你已经有 iOS 开发经验，可以通过这篇文章，用自己已有的 iOS 知识去使用 Flutter 构建应用。

文章主要介绍 UIView、UIViewController 等 iOS 常见知识在 Flutter 中怎样使用。共包含 12 个章节：View、页面导航、线程和异步、工程结构/本地化/依赖和资源、ViewController、布局、手势检测和 Touch 事件处理、主题和文字、表单输入、与硬件交互/第三方服务和平台、数据库和本地存储、通知。

作为给 iOS 开发者的入门 Flutter 的文章，本文内容全面，也可以作为开发手册来查阅。另外，作者还翻译了 [给 Android 开发者介绍 Flutter](http://ie8384.com/blog/index.php/archives/1602/)，有兴趣可以阅读。

## 设计

### [Photopea: advanced image editor](https://www.photopea.com)

Photopea 是一款免费的在线 Photoshop（替代品），拥有和 PS 几乎相同的界面和快捷键，并且支持多语言，已经有超过 150 万独立访客。

## 工具

### [手机上的抓包神器 Stream](https://itunes.apple.com/cn/app/stream/id1312141691?mt=8&ct=appshare-cn)

配置简单，不需要改代理等繁琐操作，即可

1. 抓取手机上的 HTTP & HTTPS 请求和响应，方便开发和测试人员快速定位线上问题。

2. 重放和构建请求，高效调试服务端接口。

3. 支持在 iOS 上实现配置 Hosts 的效果，方便产品和测试切换线上和测试环境。

4. 集成一些常用工具，如 URL Decode/Encode，md5，base64，时间戳转化等。

### [另一款轻量级的 UI 实时调试工具 - Sherlock](https://sherlock.inspiredcode.io/)

这是除 Reveal 外又一款支持实时调试 UI 的工具，相比于 Reveal，Sherlock 虽然没有 Reveal 那么强大的功能，但它更加轻量级，且无需任何配置，打开模拟器和 Sherlock 就可以直接使用。此外，它还支持调整屏幕大小以测试你的 UI 在各类屏幕上的展示效果，不需要你去启动各种模拟器。目前 Sherlock 正处于 Beta 测试中，暂时只支持 iPhone 模拟器。

### [SmartBaby](https://itunes.apple.com/us/app/smartbaby/id1438971945?mt=12)

SmartBaby 是一款提高 Swift 开发者效率的工具。它能从 JSON 推断出 Codable 模型，且具有好用的自定义功能。创建的模型可按照 Project 分组，并使用 CloudKit 存储在 iCloud 的私有数据库中。

> 由 SmartBaby 开发者 [@nixzhu](https://github.com/nixzhu) 自荐

## 代码

### [AloeStackView](https://github.com/airbnb/AloeStackView)

AloeStackView 是一个类似垂直 UITableView 的类。它着重于让 UI 的实现变得非常的快速、简单和直接。不过为了实现更简单、更安全的API，它放弃了 UITababieView 的一些特性，如视图循环。

特性
- 允许您保持对视图的强引用并动态更改其属性，而自动布局让 UI 实时更新。
- 允许视图动态添加、删除、隐藏和显示，并提供可选动画。
- 包括对视图间可定制分隔符的内置支持。
- 提供可扩展的 API ，允许添加专用功能而无需修改 AloeStackView 本身。
- 在高流量的 iOS 应用程序中广泛使用和审查。
- 小的、易于理解的代码库（在500行代码之下）没有外部依赖性，调试轻松。

## 音视频

### [LEARN TALKS AWESOME CONFERENCE AND MEETUP TALK](https://learntalks.com/)

顾名思义，learntalks 是一个学习如何 talk 的网站，面向技术人员。网站收录了技术领域时下热门的技术大会的演讲视频，其语言涵盖了 Swift，Kotlin, Javascript 等，颇有一种足不出户就能阅遍天下大会的感觉，学技术和学 talk 同时进行。推荐关注。

### [Flutter 免费视频教程第一季：开发环境搭建](https://juejin.im/post/5be3d54cf265da611d6624d3)

手把手带你配置 Flutter 开发环境的视频教程，除视频外作者还编写了非常详尽的文字教程，对正在入坑 Flutter 的小伙伴可以看看。

## 内推

- [北京-百度网盘 持续招 iOS 开发](https://talent.baidu.com/external/baidu/index.html#/jobDetail/2/102507)：社招、应届、实习均可。项目在技术上很有挑战性，团队技术氛围极好。诚心希望各路大神前来切磋，也欢迎计算机基础好的小白来共同学习。简历发邮箱 xuyafei01@baidu.com，暂不考虑的也欢迎微博私信 [@小非86](https://weibo.com/xuyafei86) 聊聊~

- [北京-蚂蚁金服 招iOS/安卓/前端开发](https://job.alibaba.com/zhaopin/position_detail.htm?trace=qrcode_share&positionCode=GP031268&from=timeline&isappinstalled=0)：负责支付宝会员及帐号业务线，地点北京国贸，金台夕照地铁站出口 100 米。有兴趣的同学欢迎将简历发送到：weijing.wdf@alibaba-inc.com / weijing.wdf@antfin.com （同一个邮箱）或者微博私信 [@折腾范儿_味精](https://weibo.com/agvicking) 了解情况。

- 上海即刻：如果你认识聪明勤奋、胆大心细、有追求的工程师，那就来加入我们吧！任何推荐或简历可直接发给 Jason（即刻 iOS leader）: jasy@okjike.com，或微博 [@JasonYuh](https://weibo.com/jasonyuh)。

- [杭州奇志科技招聘 iOS、前端](https://www.lagou.com/gongsi/34872.html)：奇志科技自 2016 年起通过行业无人机协同工作流 Mesh 进入物联网与人工智能领域， 并成功为房地产、建筑、测绘、电力巡检等行业提供无人机解决方案。感兴趣可以微博上私信 [@没故事的卓同学](https://weibo.com/u/1926303682) 了解。

- [深圳头条研发中心诚招各路 iOS 好手一起做取悦自己的项目](https://job.toutiao.com/2018/spring_referral/?token=alPR8WCv8nnnc5QqtsyKjw%3D%3D&key=MTY1MDMsMTg0MTQsMjA1MjAsMTk1NjEsMTU2ODksMTc0ODk%3D)：如想了解更多深圳头条的信息，可以加小T微信：tomtan，切磋技术和聊情怀都可以喔~~~~

- [北京字节跳动 iOS 团队持续招人中](https://job.toutiao.com/society)：简历可以发送到邮箱 raozhizhen@gmail.com，或者添加我（[@AidenRao](https://weibo.com/AidenRao)）的微信 jingmu1994 了解更多公司及岗位信息。

- [北京百度教育事业部招 iOS 开发](https://www.baidu.com/s?wd=百度)：百度教育事业部，地点：北京西二旗。部门下面有百度阅读，百度文库，百度爱听等 App 产品。团队技术氛围浓厚，有兴趣的同学欢迎将简历发送到我的邮箱：lizelei@baidu.com。

## 关注我们

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

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

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

## 本期编辑

[@四娘](https://kemchenj.github.io)，[@享耳先森](https://github.com/iblacksun)，[@Damonwong](https://weibo.com/damonone)，[@折腾范儿_味精](http://weibo.com/agvicking)，[@张嘉夫](https://weibo.com/2949394297)，[@AidenRao](https://weibo.com/AidenRao)，[@Parsifal](https://weibo.com/parsifalchang)，[@aaaron7](https://weibo.com/aaaron7)，[@方秋枋](https://weibo.com/100mango)，[@kyo](https://github.com/KyoLi)，[@tom510230](https://xiaozhuanlan.com/u/6682065345)，[@anotheren](https://anotheren.com)，[@水水](https://www.xuyanlan.com)，[@looping](https://github.com/looping)，[@老老老老老老老驴](https://weibo.com/u/6090610445)，[@小非86](https://weibo.com/xuyafei86)，[@邦ben](http://weibo.com/linwenbang)，[@红纸](https://github.com/nianran)，[@含笑饮砒霜](http://chinafish.news)，[@JimQ](https://github.com/waz0820)

## 说明

🚧 表示需翻墙，🌟 表示编辑推荐

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