# 老司机 iOS 周报 #45 | 2018-11-26

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

## 小专栏

[Swift 开源项目精选导图](https://xiaozhuanlan.com/topic/5271086934)

这份文档主要基于微博 [@SwiftLanguage](https://weibo.com/swiftlanguage) 跟踪过活跃于 Swift 语言领域的那些 GitHub 开源项目，顺便也是对于过去几年关注的内容进行一次系统化梳理。尝试整理出一份相对结构化且精练的 Swift 开源项目参考知识库，它将主要以思维导图形式呈现。

## 文章

### 🌟 🐢 [Hades：移动端静态分析框架](https://tech.meituan.com/hades.html)

本文介绍了大众点评基于 Objective-C 的代码静态分析工具 Hades 的研发经验，重点解决了以下痛点：
- 开发成本高，收益有限，研发参与积极性不够。
- 针对局部代码分析，跨编译单元以及全局性分析较难。
- 增量分析困难，CI 静态检查效率低下。
- 工具性较强，大部分只作代码规范检查，应用范畴局限。
- 接入和维护成本高，难以平台化。

Hades 相对于市面上已有的工具，在研发端解决了代码检查规则维护困难的问题，在 CI 端解决了性能问题，因为针对每次检查都可以持久化 Model 对象，在扩展性上还有很大的想像空间，大众点评团队为我们提供了很好的代码静态分析工具研发思路。目前 Hades 还是闭源阶段，将来有可能转为开源。

P.S. 目前iOS平台上的代码静态分析工具一览表
[SwiftLint](https://github.com/realm/SwiftLint)
[Appscreener](https://appscreener.us/)
[Checkmarx](https://www.checkmarx.com/technology/supported-coding-languages/)
[Fortify](https://github.com/mre/awesome-static-analysis)
[Infer](https://github.com/facebook/infer)
[oclint](https://github.com/oclint/oclint)
[Veracode](http://www.veracode.com/products/static-analysis-sast/static-code-analysis)

### 🐕 [Swift Development with Visual Studio Code](https://nshipster.com/vscode/)

Swift 在早些时候宣布将支持 LSP（Language Server Protocol），整个社区都沸腾了。人们涌上街头，奔走相告，一遍遍的确认着：我们可以摆脱 Xcode 了吗？VSCode 作为 LSP 支持的先驱者与佼佼者，目前基本已经是行业排行第一的通用型代码编辑器。

本篇文章由 mattt 大神出品，详细介绍了怎么在 VSCode 中配置 Swift 的开发环境。目前虽然 Swift 的 LSP 支持还处于 early stage，但已经可以支持最常用的自动完成、快速帮助以及跳转定义等功能。并且基于 VScode 强大的插件生态，还有 SwiftLint 这样的插件可以来提升代码的风格优化。不得不说，人们对于 Swift，尤其是非 Apple 生态下的 Swift 开发体验跨越式升级，已经发生。


### 🚧 🐢 [Xcode and LLDB Advanced Debugging Tutorial](https://medium.com/@fadiderias/xcode-and-lldb-advanced-debugging-tutorial-part-1-31919aa149e0)

作者准备了一个简易项目，演示了如何利用 Xcode 和 LLDB 进行高级调试。

- [第一部分](https://medium.com/@fadiderias/xcode-and-lldb-advanced-debugging-tutorial-part-1-31919aa149e0) 在断点处添加调试命令，注入一行新代码进行调试。

- [第二部分](https://medium.com/@fadiderias/xcode-and-lldb-advanced-debugging-tutorial-part-2-8bfeae4cdfdb) 通过给属性添加观察点，当其变化的时候，会中断程序，观察到属性变化的前后值，及可以进行堆栈追踪。

- [第三部分](https://medium.com/@fadiderias/xcode-and-lldb-advanced-debugging-tutorial-part-3-8238aca63e7c) 在断点中，通过调试命令新增新的断点，使断点在某些场景下才开始执行，更高效的追踪问题。

### 🚧 🐢 [A taste of MVVM and Reactive paradigm](https://medium.com/flawless-app-stories/a-taste-of-mvvm-and-reactive-paradigm-5288a819cca1)

本文通过一些简单的类讲述了什么是 MVC 和 MVVM，以及如何进一步研究 Rx。您可以自由地创建自己的架构，但无论您做什么，一致性都是关键，不要让别人看的时候感到困惑或惊讶。

所有设计模式的简单原则可总结为:

- 确定应用程序的各个方面的变化，并将它们与保持不变的方面分开
- 编程到接口，而不是实现
- 组合好过继承

希望本文对正在为架构选型而头疼的朋友有所帮助。

### 🐕 [实用的可选项（Optional）扩展](https://swift.gg/2018/11/19/useful-optional-extensions/)

`Option` 是 `Swift` 最基础的内容，它迫使开发者们处理好一些临界情况，使得程序更加健壮。标准库中 `Option` 的 API 非常少，编码过程中通常需要配合 `if let` `guard let` 一起使用，这容易造成多分支。作者参考了 `Rust` `Scala` 等语言的实现，给出了一些 `Option` 扩展，或许你可以用于自己的项目中。

### 🚧 🐕 [Stubbing in pair with Swift compiler](https://medium.com/@londeix/stubbing-in-pair-with-swift-compiler-c951770a295b)

Unit tests 中 stubbing 是一个很常见的做法，现在也有很多成熟的框架。而本文却从另外一个角度来做： 利用 Swift 的语言特性来做另类的轻量级的 Stubbing。
这种做法的应用面虽然比较有限，但是不妨可以了解一下作为参考。

### 🐕 [关于 performSelector:afterDelay: 的一个坑及思考](https://juejin.im/post/5bee9218e51d4520b7711fc8)

本文通过对于 `performSelector:afterDelay:` 函数进行了研究，总结了以下三点内容：

1. 在一个没有开启 `RunLoop` 的子线程中调用 `performSelector:afterDelay:` 函数，最终是不会被执行的
2. 看似相近的 API，可能不是同一个模块提供的，其实现方式也不尽相同
    - `performSelector:` 来自于 `NSObject.h`，其是有 id 类型的返回值，并不依赖于子线程的 `RunLoop` 开启状态
    - `performSelector:withObject:afterDelay:` 来自于 `NSRunloop.h`，其并没有返回值，依赖子线程的 `RunLoop` 开启状态
    - `performSelectorOnMainThread:withObject:waitUntilDone:` 来自于 `NSThread.h`，其并没有返回值，依赖主线程的 `RunLoop` 开启状态
3. `performSelector:` 中函数定义在其他地方就会引起编译警告，如果函数没有返回值可以使用 `performSelectorOnMainThread:` 或者 `performSelector:withObject:afterDelay:` 来避免编译警告

### 🐕 [函数式编程 - 有趣的 Monoid（单位半群）](https://www.jianshu.com/p/f935e54faad3)

本文介绍了在函数式编程中比较核心的一个概念 Monoid（单位半群）。从半群到单位半群，从数学定义到 Swift 的展开实现，以引导教学的方式带领读者一步步深入了解 Monoid，极易消化理解。后半部分介绍了几个有趣实用的 Monoid 类的数据结构，且都有递进式的概念讲解及 Swift 实现。

另外，本文是近两年来作者关于[函数式编程系列](https://www.jianshu.com/c/884e7fb9b8ec)文章中的最新一篇。本系列文章同样都是采取引导递进式的行文风格，作者从 Haskell 这种标准化的、通用纯函数式的编程语言中汲取灵感，将诸多函数式编程的核心概念改造为 Swift 实现，让我们从新的角度去认识 Swift 以及 与 Swift 相关的函数式编程思想，Swift 或 函数式编程爱好者不容错过。

### 🐎 [Unit testing retain cycles](https://paul-samuels.com/blog/2018/11/20/unit-testing-retain-cycles/)

循环引用问题会造成内存泄露，轻则影响应用性能，重则导致应用闪退，非常影响用户体验。同时它也是不太容易被发现的。所以在开发测试过程中，增加对循环引用的检测很有必要。

本文就介绍了如何在单元测试中检查循环引用。思路很简洁，通过建立弱引用去检测。这样我们就能保证代码库本身没有问题，正如文末所说的 “get a level of comfort”。除了检测方式，作者所表现出的这种为代码负责任的态度也是值得我们学习的。

### 🐕 [Self-sizing Table View Cells](https://www.raywenderlich.com/8549-self-sizing-table-view-cells)

这是一个关于 tableview cell 的布局教程，该本教程中，您将学习如何启用自动调整大小的 cell ，以及如何使它们按需调整大小并支持动态类型。该教程通过 storyboard 加代码的教程形式，一步步完成一个大家常见的 tableview 需求，并附上了项目 demo 。

### 🐕 [Extending optionals in Swift](https://www.swiftbysundell.com/posts/extending-optionals-in-swift)

Swift 里的 Optional 虽然帮助我们保证了内存安全访问，但在很多情况下都需要我们解包后再进行操作，让代码显得比较啰嗦而且不连贯。

Sundell 这周就给我们带来了 Optional 的实用拓展，总结了一些 Optional 常见场景，并且构建对应的语法糖去优化 Optional 的使用。

### 🐕 [Swift Async Operations at Your Command](https://tworingsoft.com/blog/2018/11/19/swift-async-operations-at-your-command.html)

当一个操作相对比较复杂时，使用 Operation 封装上下文会是一种比较合理的做法，这篇文章里作者分别介绍了 Fabric 封装的 FABAsyncOperation 和 FABCompoundOperation 以及各自的使用场景，并且讲述了他在项目中使用 Swift 重写的过程。

### 🐕 [关于 Swift defer 的正确使用](https://onevcat.com/2018/11/defer/)

在 Swfit 中，defer 关键字即为延迟的意思，用 defer 声明的 block 并不会立刻执行，而是在当前代码执行退出后被调用，这类似于 JAVA 里的 try/finally。最近，喵神在重构 `Kingfisher` 的时候，因为 defer 的使用不但而造成了 bug。为此，喵神完整梳理了下 defer 的特性以及使用方法。

## 代码

### [30-seconds-of-swift-code](https://github.com/elizabethsiegle/30-seconds-of-swift-code)

一个立志于让你 30 秒看懂一段 Swift 代码的项目，较为新手向，方便新人快速了解 Swift 的内建函数。当然老鸟也不妨一读，总有你漏掉的知识点。

### [LINE SDK for iOS Swift](https://github.com/line/line-sdk-ios-swift)

用 Swift 开发的 iOS LINE SDK 可以让我们用现代化的方式来实现 LINE API，包括用户认证及通过 OpenID 获取用户信息等功能，为 iOS app 开发有吸引力的、个性化的用户体验。

## 内推

- [北京-百度网盘 持续招 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)，[@邦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）
