# 老司机 iOS 周报 #37 | 2018-09-24

![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 4.2 正式发布](https://swift.org/blog/swift-4-2-released/)

Swift 4.2 正式发布。我们可以通过 WWDC 2018 的 Session [What’s New in Swift ](https://developer.apple.com/videos/play/wwdc2018/401/) 快速了解新特性。Ole Begemann 总结的 [Playground](https://oleb.net/blog/2018/06/whats-new-in-swift-4-2-playground/) 也方便我们上手试验把玩。

### [一本走心的 JS-Native 交互电子书](https://juejin.im/post/5ba03ea25188255c3f6bcc8c)

知识小集团队 @lefe_x @halohily 同学潜心著作的一本学习 JS-Native 交互的电子书，这个专题旨在能够帮助更多的同学掌握 Hybrid 在 iOS 中的应用。整个专题总共分为四章，强烈推荐给大家

第一章 主要介绍 JS 语法，为后续的章节做好铺垫，不过建议读者系统地学习一下 JS，对整个专题的理解有很大的帮助；

第二章 介绍了 JavaScriptCore 这个框架与 OC 间的通信；

第三章 介绍了 WKWebView，以及一些调试技巧；

第四章 主要对前面讲到的知识进行实践，其中 JSPatch 部分理解起来比较吃力，如果读者想深挖 JSPatch可以结合源码一起看本章内容，理解起来更透彻。

### [微信开源基于 mmap 内存映射的 key-value 组件 MMKV](https://github.com/Tencent/MMKV)

微信团队于最近宣布开源 MMKV，这是一个基于 mmap 内存映射的 key-value 组件。而这个组件在微信内部已经使用了 3 年，稳定性上得到了验证。而在性能上，也比传统的 NSUserDefaults 等方案更加出色。并且也移植到了 Android 平台，在这次一起开源。


## 专栏

### 🐢 [Swift for TensorFlow, First Class Machine Learning in Swift](https://xiaozhuanlan.com/topic/6123854970)

Swift for TensorFlow 是 Chris 到 Google 之后发布的新项目，目的在为 Swift 提供内建的机器学习能力。整个技术用了非常巧妙的方式，在编译器层面实现了对 TensorFlow 的支持，非常创新。并且从项目的设计思路也能够感受到 Chris 对 Swift 这门语言的一些想法，Swift 绝不简单是客户端或者服务端编程语言，而是一个全新的编程平台，开放优雅的架构使其能够无缝和其他语言进行交互，而且是在类型安全的前提下。

我在 2018@Swift 大会上分享了一这项技术的一些原理和应用，这篇文章是分享的文字版。

Swift for TensorFlow 



### 🐢 [[译]SE-0206 Hashable 加强](https://xiaozhuanlan.com/topic/1470362958)

Swift 4.2 其中一个比较大的改动就是 `Hashable` 协议，对这么一个基础的协议做改动，即使在一年出一门新语言的 Swift 大家族里也几乎是第一次🤷‍♂️，看到这篇提案的时候我就产生了这么几个疑问：

1. 为什么要用 `inout` 这种大家很陌生的概念?
2. Hasher 好像是哈希函数的抽象，那为什么它不是一个泛型，而是结构体？那应该怎么去自定义哈希函数？
3. 而且为什么要去改动这么一个基础协议？之前的协议有哪些不足？

在查阅了一些资料之后，我发现国外对于这件事情的讨论其实也不多，最好的资料还是 Swift-Evolution 的提案，所以特意翻译出来，希望能够帮助大家更好地了解这一次基础协议改动的来龙去脉。

## 文章

### 🐎 [这次 swift 大会分享准备的幻灯片和 demo](https://www.jianshu.com/p/57331c22d788)
这次 2018@Swift 大会，戴铭的幻灯片惊艳全场，把本身就比较晦涩的编译原理相关的知识，用美轮美奂的漫画体现出来，给人一种耳目一新的感觉。这篇文章讲了一些分享的背景还列出了全部幻灯片的截图，错过大会的同学不容再错过文章。

个人最喜欢的是 AST 那几 p，你们呢？

### 🐎 [Facebook 工作体验之绩效考核](https://mp.weixin.qq.com/s/eJ1ue5l5f0W1jvZ4unJJkA)

本文讨论了 Facebook 和国内公司的业绩考核之间的异同。讲来不同的考核制度本身并没有什么好坏之分，更多的还是在不同环境下取得对公司和员工最有利的情况。

Peak 老师自加入 Facebook 后贡献了好多篇国内和湾区的工作生活比较的文章，对于好奇湾区这边（不代表美国其他地区）码农的工作生活状态的同学，值得一读。

### 🐎 [员工之间可不可以讨论工资收入？](http://mrpeak.cn/blog/salary-share/)

Peak 大神抛出了一个比较有意思和值得讨论的问题，员工之间可不可以讨论工资收入？Peak 大神还贴出了阿里和Facebook在这个问题上的态度对比并附上了自己的见解。不知你们对这个问题又有什么看法呢？

### 🐢 [深入浅出 Swift Numerics](https://github.com/xwu/xwu-swift-numerics)

Swift 社区开发者 [Xiaodi Wu](https://github.com/xwu) 写了一系列文章，介绍了 Swift 中数字类型背后的设计思想(如 Int、Float 等)以及许多 `Numeric Protocols` 间的关系，建议有 Swift 开发经验的开发者们精读。

### 🐕 [FastImageCache 原理](https://mp.weixin.qq.com/s/5rgQjokaUduSuiPKbJIudw)

对于大多数 app 来说，图片存取/编解码都是绕不过去的话题，而这通常会占用相当一部分的计算/存储资源，值得大家反复研究。本文作者分析了 path 维护的 FastImageCache，从 mmap、decoding 和 byte alignment 几个角度来分析其对图片加载性能的优化。

### 🐎 [iOS 12 JS 数组 Bug，可能带来互联网风波，附解决方案](https://juejin.im/post/5ba1c129e51d450e6237da01)

iOS 12 发布了，但很多前端同学却发现 iOS 12 中 WebView 的一个大 BUG ，对数组进行 reverse 操作会导致 webview 将该数组的最后形态进行缓存，关闭页面退出页面都不会清掉，在 StackOverFlow 上也有人探讨，好在博主给了一个解决方案，快来看看吧。

### 🐎 [Capturing Self with Swift 4.2](https://benscheirman.com/2018/09/capturing-self-with-swift-4-2)

Swift 4.2 中 `self` 在 optional binding 中不再作为保留关键字。现在可以忘记 strongSelf 了，直接这样写吧：

```swift
guard let self = self else { return }
```

### 🐕 [Adding Padding To A Stack View](https://useyourloaf.com/blog/adding-padding-to-a-stack-view/)

UIStackView 是苹果在 iOS9 中引入的一个新的视图类。Stack View  可以高效的排列一行或者一列视图。在使用中，我们的子 View 很可能是需要动态调整高度的，这时候，我们既可以通过 Interface Builder，也可以通过代码在需要调整高度时候重新布局。但是，实际上，我们可以更简单高效的解决这个问题，就是使用 Readable Content Guides。

### 🐎 [Async/await in Swift unit tests](https://www.swiftbysundell.com/posts/asyncawait-in-swift-unit-tests)

Async/await 一直是 Swift 开发者期待的功能，但是由于在写单元测试的时候需要一些异步测试场景，所以 sundell 通过对 Futures & Promises 的进一步改造实现了一个 await 函数 的作为 Swift 还没支持 Async/await 的折中方案。整个实现思路还是很通俗易懂的。

### 🐕 [What I Learned Making 5 ARKit Prototypes](https://medium.com/@nathangitter/what-i-learned-making-five-arkit-prototypes-7a30c0cd3956)

5 个基于 ARKit2 的原型，用来提升购物体验、给报纸添加视频、观看绘画时增强关键人物，使涂鸦墙能够观看历史，给穿戴设备做屏幕延展。 AR 有非常大的潜力，这 5 个原型也许能激发你的灵感。

### 🐕 [2018 Google 开发者大会现场纪要](https://juejin.im/post/5ba5b94ae51d4527ed0023dc)

Google 今年在上海的 GDD (Google Developer Days) 上周末圆满结束，算是一次做的非常成功的国际公司在国内搞的 Developer 相关的活动。如果你没有去现场参加的话，赶紧跟着去参加了的开发者们去看看 GDD 上的亮点吧。

### 🐕 [What’s new in Swift 5.0](https://www.hackingwithswift.com/articles/126/whats-new-in-swift-5-0)

Swift 的下一个版本是5.0，首要目标就是让 ABI 稳定（存疑，现在还有好几个[issue](https://swift.org/abi-stability/)没动静），另外还有一些比较重要的特性，通过[预设置好的playground](https://github.com/twostraws/whats-new-in-swift-5-0)可以体验这些特性
* Raw strings：可以将字符串的转义操作变得更好用了
* Handling future enum cases：switch 操作中，default 的处理通常意味着一些未能处理得很好的逻辑，现在可以在 default 前加上`@unknown`标记，让编译器在编译时产生一个 warning
* Checking for integer multiples：增加了`isMultiple(of:)`函数，相当于之前的模除操作，譬如`if rowNumber % 2 == 0`跟`rowNumber.isMultiple(of: 2)`等价
* Counting matching items in a sequence：数组的 count 函数也可以加上一些 filter 操作了
* Transforming and unwrapping dictionary values with compactMapValues()：对于 Dictionary 对象增加了`compactMapValues()`函数，将`compactMap()`和`mapValues()`结合起来，变得更加方便

### 🐢 [i​OS 12](https://nshipster.com/ios-12/)

NSHipster 出品，从 API 角度解析 iOS 12 中值得关注的改进。主要包括了以下几部分内容：为重要数据请求提高网络优先级、后台读取 NFC 标签、使用电话号码和电子邮件地址来匹配通讯录、在航空中更新位置、识别平放的设备、输入框中的自动填充新密码和短信验证码。十分推荐阅读。

### 🐕 [操作系统是如何管理内存的](http://limboy.me/tech/2018/09/14/os-memory.html)
作者针对[Operating Systems: Three Easy Pieces](http://pages.cs.wisc.edu/~remzi/OSTEP/)这本书中关于内存管理这块的做了一个小结，介绍了操作系统在处理内存管理中遇到的问题和演化方案，帮助读者增加内存管理方面的知识
* 如果是单进程模型，很简单，一块内存空间是内核的，一块内存空间是进程的
* 如果是多进程模型，考虑一下上下文切换问题，就需要有 base 和 bounds 来表示如何切换
* 考虑多进程间使用内存的空间利用效率问题，出现了分段的解决方案
* 为了解决分段方案带来的内存碎片问题，出现了分页的解决方案

## 工具

### [Xcode 10 小技巧： NSData 的 popover 里可以直接下载内容](https://twitter.com/weichsel/status/1042794107259764736)

Xcode 在 debug 的时候，能够直接查看 `UIImage`、`NSString` 等类型数据，但是一直不支持 `NSData` 的查看。现在 Xcode 10 已经提供了这么一个功能，可以允许你通过预览小窗导出当前正在 debug 的 `NSData` 对象到本地，再进行查看。

## 代码

### [2018 中国 Swift 开发者大会源文件，包括 pdf 和源工程文件](https://github.com/atConf/atswift-2018-resources)

@Swift CON 2018 - 一场面向 Swift 开发者的知识盛宴，已于 09 月 15 日在北京顺利举行。由于各种原因未能去参加的各位同行，现如今可以通过这个开发者大会源文件了解到此次大会的主要内容。

### [Awesome README](https://github.com/matiassingers/awesome-readme)

好的 README 包括但不限于配图、屏幕截图、GIF、文本排版等。这是一个优秀 README 列表，以及一些帮助你写好 README 的工具。


## 设计

### [Designing and Developing for Siri Shortcuts](http://blog.maxrudberg.com/post/178153402778/designing-and-developing-for-siri-shortcuts)

作者从代码和 UI/UX 设计角度展示了如何为现有的 app 加入 Siri Shortcuts 功能，包括增加 App Store 截屏、启动屏通知并且在设置界面里着重展示。

## 内推

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

## 说明

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

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