# 老司机 iOS 周报 #38 | 2018-10-08

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

## 新闻

### [TestFlight 开始支持邀请链接](https://developer.apple.com/news/?id=09262018a)

在今年的 WWDC 中，苹果就已经透露将在下半年推出 TestFlight 的公开链接邀请功能，现在这个功能已经正式开放。

> 另外 [dustturtle](https://github.com/dustturtle) 也第一时间分享了自己的实践成果 - [千呼万唤始出来 - TestFlight public link 功能正式发布了！](https://juejin.im/post/5bac3ba7e51d450e531c9d2c)。

### [Apple’s use of Swift in iOS 12](https://blog.timac.org/2018/0924-state-of-swift-ios12/)

iOS 中使用 swift 的地方在持续增加，在 iOS 12 中包含 swift 的库相比 iOS 11 增加了一倍。

### [Swift 5.0 Release Process](https://swift.org/blog/5-0-release-process/)
 
Swift5.0 离我们越来越近了，了解一下最近的进展吧
1. 二进制不向下兼容，容易理解，Swift 新版本就没有向下兼容过
2. 必须强制迁移 Swift3.0 的代码，不然你只能使用 Swift4.2 来编译了
3. 现在提供了 Swift5.0 的[尝鲜版](https://ci.swift.org/)
4. 预计2018年11月16日对于 Swift5.0 是一个很关键的时间结点（真的吗？）
5. 希望你们会喜欢 Swift5.0 的新编程思想（又变？）

## 专栏

### [iOS 上修改私有方法的几种方式解析](https://xiaozhuanlan.com/topic/1278405369)

iOS 开发中，或多或少都会有遇到修改私有方法的需求，这篇文章总结了目前我们能够使用的方式，并从面试官的角度推荐应聘者应该怎么回答这类开放性问题。

## 文章

### 🐢 [Mirror 的工作原理](https://swift.org/blog/how-mirror-works/)

这篇文章主要介绍了 Mirror 的工作原理，Mirror 简单来说就是用来做类型反射的 API，可以在运行时里获取实例的类型信息，例如 Playground 里的变量数据预览就是基于这一套 API 来完成的。

文章主要分为两个部分，第一部分是元类型的抽象（类型的类型），运行时函数动态派发的实现原理，第二部分就是 enum / struct / class / tupe 四种元类型各自的实现。

通篇看完感觉其实 Mirror 的实现非常直截了当，因为 Swift 的泛型功能要求它必须有足够丰富完整的 Metadata，才能在运行时更好的描述泛型实例的存在，完成函数派发，属性存取和类型转换的工作。

在这么一个背景下，Mirror 的实现基本就是从已有 Metadata 里获取类型数据，然后展示出来，或者是通过 Metadata 定位成员变量的相对位置，然后进行存取操作。

### 🐢 [AR Face Tracking Tutorial for iOS: Getting Started](https://www.raywenderlich.com/5491-ar-face-tracking-tutorial-for-ios-getting-started)

Ray Wenderlich 的又发新教程了。这次是教你如何用 TrueDepth Camera 来做 AR 面部追踪。

和往常一样，他家教程类文章会有非常详细的步骤和截图，带你一步一步的操作，非常适合对文章中涉及的知识领域不是很熟悉的同学们。

另外这篇文章也是免费教程的一部分，所以并不需要进行任何付费。

### 🐎 [Why #if DEBUG Conditional Should Be Avoided in Library Code](http://holko.pl/2018/09/24/compilation-directives-in-libraries/)

文章作者分享了一次自己使用 Carthage 导入自己的库时遇到的坑，来说明了为什么在 SDK 的开发中尽量避免条件编译指令，因为你不知道使用你 SDK 的人的编译环境会有怎样的变数，文章很短，算是一次有趣的小分享。


### 🐢 [[译] Metal 渲染管线教程](https://juejin.im/post/5b9dbd76e51d450e877f3780)

Apple 在 2018 的 WWDC 上正式宣布 OpenGL ES 标记为 deprecated，推荐使用 Metal 来做 3D 渲染，很有勇气。在细致的了解 Metal 后，就能发现苹果的勇气不是没有原因的，Metal 几乎最大限度的利用了 iOS 的硬件特性来提升性能，是 iOS 的首要选择。

本篇文章的文风很像很多经典的 OpenGL 教程，从渲染的概念，流程讲起，并一步步教你如何画出第一个三维的物体，强烈推荐有兴趣的同学仔细阅读。

> 推荐人：[史前图腾](https://juejin.im/user/5a311af051882554bd510dd0)

### 🐢 [beeshell：开源的 React Native 组件库](https://mp.weixin.qq.com/s/c1WId0Rr4m7hUOa2HDGnXg)

文章介绍了美团所开发的基于 React Native 的组件库，提供了一系列基础 UI 组件，包括按钮、弹窗、表单、输入框等等，覆盖了 iOS 和安卓两端，并分析了一些设计理念。


### 🐕 [从 FE 视角看大前端](https://zhuanlan.zhihu.com/p/45421800)

大前端是现在比较流行的话题与方向，相信也有很多移动端的同学对这个方向有很浓厚的兴趣，而这篇文章的目标阅读群体刚好适合对前端 FE 感兴趣的 Native 开发同学, 聚焦在 PC 和 H5 浏览器层面。可以让你对前端开发有全景方式的了解, 以及引发大家的兴趣。很多 native 开发可能苦于前端众多的名词，众多的框架不知从何下手，这篇文章刚好适合你。

### 🐕 [UIField​Behavior](https://nshipster.com/uifieldbehavior/)

文章以悬浮框为例，讲解了 iOS 物理引擎 UIKit Dynamics 中的 UIField​Behavior 的相关内容。首先描述了 Field Behaviors 是什么，接着讲解了 Spring Fields 怎么用，最后结合 Behaviors 的一些特性实现了一个适用于开发调试的悬浮框。

> 推荐人：[WXGBridgeQ](https://github.com/WXGBridgeQ)

### 🐕 [巧妙实现 debugOnly 函数](https://kemchenj.github.io/2018-09-24/)
 
作者在学习 Vapor 的源码看到一段不需要宏定义的 debugOnly 函数实现。代码如下:

```Swift
func debugOnly(_ body: () -> Void) {
    assert({ body(); return true }())
}
```

对于大部分项目来说，这个功能看似没有什么用处，但是仔细考虑一下，对于一个可以被任何一个项目依赖的 SDK 来说，这个 debugOnly 实现可以说是很完美了。

### 🐢 [Bloom Filters and Swift 4.2](http://khanlou.com/2018/09/bloom-filters/)

文中实现了 Bloom Filter，并使用了 Swift 4.2 中 Hasher 新特性来优化代码。

### 🐕 [驴妈妈客户端频道页模块化设计思路](https://juejin.im/post/5bad0632f265da0ab41e62fe)

对于做偏运营类的应用开发，有一项很重要的技术需求就是能够做到对应用内容进行实时更新，而且是越灵活越好。本文就详细介绍了驴妈妈客户端团队在 SOLID 原则的指导下，重点围绕面向接口、数据驱动、模块隔离这三个点设计了适合自身业务场景的模块化框架。它既满足了缩短内容上线周期的需求，也为创建一个统一规范的业务组件库提供了思路和方向，同时框架的整体设计也是非常值得参考和学习的。

### 🐕 [INSIDE AUDIOKIT SYNTH ONE: A BRIEF TOUR FOR DEVELOPERS](https://audiokitpro.com/inside-audiokit-synth-one/)

本文的大部分内容是作者在对 Synth One 应用添加 AUv3 扩展时的开发笔记。后来他为了分享自己捣鼓开源项目 [AudioKit](https://github.com/AudioKit/AudioKit) 和 [Synth One](https://github.com/AudioKit/AudioKitSynthOne) 的经历，就写了这篇文章，也希望借此帮助那些想要做类似 iOS 音乐合成器开发的人能够快速了解框架内部的设计。

### 🐎 [代码评审的不可能三角](https://juejin.im/post/5ba99fa35188255c8138f4d2)

Code Review 是保证代码质量的重要手段之一，但许多研发团队中它常常由于各种原因并未得到真正的落地。为什么会这样呢？本文作者用一个非常简单的观点理解了这个现象，并据此给出一点优化的想法。希望本文的想法对同样被评审困扰的同学有帮助 :)

### 🐕 [利用函数组合提升代码可维护性](https://iweiyun.github.io/2018/10/03/func-compose/)

在平时的开发中，我们可能会遇到一些场景，开发起来，代码写的很繁琐，例如文中作者举的例子：

```Swift
process1(_ param: String) -> String
process2(_ param: String) -> String
process3(_ param: String) -> String
process4(_ param: String) -> String
```

这种情况，如果直接采用函数式编程，可读性又不会太好。而为了重构让代码变得具有更好的可维护性，作者利用函数的组合来解决这个问题。除了上面函数签名致的例子，作者还提到了函数签名不一致，以及异步操作这两种情况的解决方案。

> 推荐人：[matthew](https://github.com/matthewyan)

### 🐎 [MMKV 中的简单 LRU 缓存（LRUCache）](https://mp.weixin.qq.com/s/KbUHec1_sMiV1S5V-9QxlQ)

本文简明地分析了开源库 [MMKV](https://github.com/Tencent/MMKV) 中 LRUCache 的实现。MMKV 中的 LRUCache 实现简单易懂，文章中的源代码也加上了注释，大家看一遍这篇文章就能明白具体的实现原理。

### 🐕 [Migrating to Unified Logging, Swift Edition](https://www.bignerdranch.com/blog/migrating-to-unified-logging-swift-edition/)

本文介绍了一种更优雅的打log方式，使得开发人员不要再混乱地管理log代码
1. 正确对待 OSLog，他本来就帮你分了 log 的等级
2. Console.app 能够帮你更好地查看客户端的 log （如果你用的是 os_log 的话）
3. 尽量使用 os_log
4. 更多应该注意的细节


## 代码

### [andreamazz/SubtleVolume](https://github.com/andreamazz/SubtleVolume)

SubtleVolume 是一个音量条组件，也支持在 iPhone X(S/R) 的刘海上做文章，如果你的播放器需要一个自定义音量条，不妨看看它。

## 设计

### [一定要会的Sketch设计方法和工作流](https://boxueio.com/series/sketch-basics)

泊学关于 Sketch 入门相关的视频课程。

## 内推

- [北京-百度网盘 持续招 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://weibo.com/1926303682/profile)，[@四娘](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)，[@JasonYuh](https://weibo.com/jasonyuh)，[@老老老老老老老驴](https://weibo.com/u/6090610445)，[@小非86](https://weibo.com/xuyafei86)

## 说明

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

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