# 老司机 iOS 周报 #25 | 2018-07-02

![ios-weekly](../assets/ios-weekly.png)
老司机 iOS 周报，只为你呈现有价值的信息。

你也可以为这个项目出一份力，如果发现有价值的信息、文章、工具等可以到 [Issues](https://github.com/SwiftOldDriver/iOS-Weekly/issues) 里提给我们，我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 [Issues](https://github.com/SwiftOldDriver/iOS-Weekly/issues) 提出。

## 新闻

### [2018@Swift 大会来了～](https://atswift.swift.gg/)

由 SwiftGG 翻译组主办的第三届 @Swift 大会将于 2018 年 9 月 15 日在北京举办，大会邀请了来自国内外的重量级嘉宾，旨在为 iOS 开发者带来一场 Swift 的盛宴。现在使用老司机周报的专属优惠码：SwiftOldDriver 报名立减 60 元 。

### [WWDC 2018 Viewing Guide](https://useyourloaf.com/blog/wwdc-2018-viewing-guide/)

useyourloaf 对 WWDC2018 的 Session 进行了一个分类，并附带了少量的延伸阅读指引。

### [Zeplin 2.0 发布 — 引入组件模块](https://zhuanlan.zhihu.com/p/38382742)

> Zeplin 2.0 发布，带来了全新的 Components 模块、 assets 重命名，全尺寸缩略图等诸多新特性。

随着产品思路的转变，在开发和设计过程中「组件」的有效管理变得越来越重要，而 Componets 模块要做的就是让设计师和工程师更好的共享这些组件。 Componets 模块可以将 Sketch 中的 Symbol 上传到 Zeplin，选中单个组件，数显面板会显示该组件被用于哪些 Screens。

## 文章

### 🐕 [JavaScript async/await: The Good Part, Pitfalls and How to Use](https://hackernoon.com/javascript-async-await-the-good-part-pitfalls-and-how-to-use-9b759ca21cda)

ES7 引入的 `async/await` 极大地提升了 JavaScript 的异步编程能力，可以使用同步风格的代码异步访问资源、而不至于阻塞主线程。但要用好 async/await 还是有一定难度的，在这篇文章里会从不同角度探索 async/await，并展示如何正确、高效地使用 async/await。

### 🐕 [Handling mutable models in Swift](https://www.swiftbysundell.com/posts/handling-mutable-models-in-swift)

当我们能给数据结构的每个属性进行精确、访问权限可控的定义，其他模块就算不了解实现细节，也能从属性本身的定义认识数据结构，同时防止了意料之外的修改。作者权衡了代码的正确性和使用时的便利性，利用 Immutable 的性质和 FRP 的思想来描述数据结构，提升了数据结构的易用性和可维护性。

### 🐎 [Learn Core Graphics with Swift Playground](https://www.hackingwithswift.com/articles/123/learn-core-graphics-with-swift-playgrounds)

在以前的一些电子书籍中，我们跑书籍中的代码，一般都需要我们根据指示建立 demo 工程，然后 copy 或者人肉将代码输入到工程中，再运行查看效果。整个路径比较耗时不说，遇到不太专业的书籍代码的版本不清晰的估计得调个十遍八遍的才能跑起来。既然书籍都已经电子化了那能不能让书籍中的代码就能直接在书籍中运行呢？在单一环境中完成整个学习的闭环，意义重大。

近年来，人们陆续通过扩展部分 REPL 的功能部分实现了交互式的教程体验，如 iPython、Jupyter Notebook 以及 Xcode 中的 Playground 等。不过在 Apple 推出 iPad 版的 Swift Playground 后更是把动态的、可运行的交互式教程发挥到了极致，毕竟 iPad 本身就是很多人拿来看电子书的设备。文中作者基于 Swift Playground 写了一本学习 Core Graphics 的电子书，在学习的同时可以交互时的尝试不同的绘图操作并实时查看效果，简直不要太棒！有 iPad 的同学可以考虑重新学习一下 CG，或许会有很多新的收获。

### 🐕 [Airbnb and React Native Expectations](https://ashfurrow.com/blog/airbnb-and-react-native-expectations/)

又一篇英文的文章来评论关于 Airbnb 宣布下线 React Native 的事情，作者提出了一个很好的观点，使用 React Native 的人，你希望用 React Native 达到什么样的期望，解决什么样的问题呢？ React Native 的最初设计初中真的能符合使用者的预期么？ Airbnb 在运用 React Native 的时候，总共提出了 4 点目标，最终这 4 点目标他们完成的并不好，所以才决定下线。那么如果作为 React Native 使用者，你的预期又是什么呢？

作者还针对自身的体会对 Airbnb 的 4 点目标中的 2 点，跨平台与提升开发效率做出了自己的看法。跨平台方面，React Native 确实可以实现一套代码2个平台适配，甚至 Airbnb 在实践中做到包括 Web 在内3个平台适配，但这之中遇到的很多坑也是造就了不满足预期目标的原因，而 React Native 最初的设计初衷是 “learn once, write everywhere” ，当我们预期变成 “write once, run everywhere” 的时候，你是否能 handle 的住你的新预期与新规划呢？ 关于开发效率上，Airbnb 因为他们缺乏移动端工程师，使用 JS 技术栈可以最大限度发挥他们前端工程师在移动端的作用，所以他们内部的调研报告里有 60% 的人觉得，React Native 的开发体验非常的 amazing，但如果作为原生安卓/苹果开发者们，面向人群变了，还会是开发体验的一种提升么？

### 🐎 [Upgrading To Swift 4.2](https://useyourloaf.com/blog/upgrading-to-swift-4.2/)

从 Swift 4.1 升级到 4.2 的语法改动不大，主要是一些类型、常量的命名由 OC 的一长串改为按照 Swift 风格的嵌套命名空间。比如 `UIApplicationState.active` 改为 `UIApplication.State.active`，`UIContentSizeCategoryDidChange` 改为 `UIContentSizeCategory.didChangeNotification`。

### 🐕 [DeepLearning 101: Coursera Vs Udemy Vs Udacity](https://hackernoon.com/deeplearning-101-coursera-vs-udemy-vs-udacity-b4eb3de06dbe)

深度学习的热潮在近几年越来越明显，各种框架如雨后春笋般出现，苹果也相继在 WWDC17 和 18 推出了 Core ML 和 Create ML 。除了一些全职的博士/教授等科研人员，广大工程师们如果想系统的学习深度神经网络，最便捷靠谱的途径就是通过参加各种在线课程。作者横向比较了几个目前比较火的深度学习在线课程的不同点，相信能帮助感兴趣的人找到适合自己的课程。

### 🐢 🚧 [ReSwift in Practice](https://medium.com/@tobi_86596/reswift-in-practice-1512e0f59eb5)

单向数据流是一个经典的设计模式。相比在前端中的 Redux 被广泛接受，在 iOS 端与之对应的框架 [ReSwift](https://github.com/ReSwift/ReSwift) 则少被人提及，业内对于 ReSwift 在项目中的实践文章也少（因为没人用啊），这篇文章针对在业务中使用 ReSwift 做了一些总结，对于 middleware 的使用也让人颇受启发。

务实的说，大多数团队在项目中引入 ReSwift 并没有太大的价值。它的使用门槛比带来的收益大。但是通过学习这个框架深入理解单向数据流的模式是很有意义的一件事。

### 🐎 [Xcode 小技巧：利用 assets 配置针对不同设备的资源](https://juejin.im/post/5b389cf9f265da59a8365e69)

介绍了利用  assets 中的 Data Set 配置针对不同设备的资源文件的方法。

### 🐕 [Swift vs. Kotlin — the differences in memory management](https://blog.indoorway.com/swift-vs-kotlin-the-differences-in-memory-management-860828edf8)

本文对比了 Kotlin 和 Swift 如何进行内存管理。Kotlin 使用了基于 CMS 算法的垃圾回收，而 Swift 则使用了 ARC。本文没有拘泥于过多底层细节，而是用平白的语言介绍了两者的区别。是一篇入门开发者也能阅读学习的文章。

### 🐕 [What’s New in Swift 4.2?](https://www.raywenderlich.com/194066/whats-new-in-swift-4-2)

Raywenderlich 出品的 Swift 4.2 更新内容总结，功能示例代码非常齐全，而且还介绍了 SE-0193 跨模块内联函数的提案以及 SPM 的一些小更新就，目前已有的更新总结文章对于这两个方面提到的比较少，所以可以重点看一下这两个小节。

### 🐎 [Non Empty](https://www.pointfree.co/blog/posts/7-open-sourcing-nonempty)

在 Swift 里很多时候你明明知道数组不为空，但还是需要为 `first` 或者 `last` 之类的属性进行解包才行，更好的方式应该是构造一种**非空集合**类型去进行约束。

Swift 教学网站 PointFree 最近就开源了一个 NonEmpty 库，通过给集合类型加上一层封装，让我们可以在类型安全的情况下，更加方便的使用非空数组，避免多余的解包。

### 🐢 [帮助你做一个更好的软件架构师](https://hackernoon.com/38-actions-and-insights-to-become-a-better-software-architect-f135e2de9a1b)

何谓"架构"，架构师的工作是什么，这是长久以来大家一直在讨论的问题。本文是作者通过对软件架构的本质的思考，总结出若干条软件架构师必备的技能，从而提出个人的方法论。作者认为对于软件架构师而言，有以下10个点是必须要考虑的
- 软件设计：在合适的设计模式中选择，并制定出适合团队的方案
- 方向选择：通过多方面的评估，根据自己的能力选择团队前进的方向
- 方案简化：最简单的方案往往就是最合适的方案
- 坚持编码：站在别人的角度看问题会更好
- 文档：如果可以的话，尽量采用工具自动生成文档
- 沟通力：好的沟通能力有助于方案落地
- 前瞻性：具有前瞻性的软件架构生命周期会很长
- 性价比：制订方案的时候需要考虑方案的投入和收益是否在合理的范围
- 咨询辅导：通过大量的培训帮助成员提高技术水平
- 营销手段：高明的营销手段能让大家的目标一致，达到事半功倍的效果

### 🐢 [美团外卖iOS多端复用的推动、支撑与思考](https://mp.weixin.qq.com/s/l2BjXPPbCiXZ-gYlOcD7ug)
前两年，组件化的话题在iOS业界可以说是非常火。组件的通信解耦方案，是runtime，还是openURL，又或者protocol方案，组件怎么进行包的管理等等讨论的非常多，很多大牛以及公司都给出了自己的答案。我在工作中也在团队中进行了组件化的一些探索。在整个实践过程中，我发现，最重要的其实并不是上面提到的这些，而是对现有工程更好的分层，尤其是对于要支撑部门多个App的场景下，基础库的下沉，如何设计去提高组件的复用程度从而带来整体开发效率的提升，这个在我看来可能是最重要的，而相反的是，这部分的文章并不多。这次美团的这篇文章详细叙述了这一块的实践和思考，我觉得各位在有想法进行组件化的时候，不妨先看下这篇文章。

## 工具

### [Test Drive](https://github.com/JohnSundell/TestDrive)

在 playground 上快速尝试一个 Swift Pod 库或框架。例如使用命令 testdrive Kingfisher，即会新建一个集成了 Kingfisher 的 playground，提升体验各种库和框架的效率。

## 代码

### [Sift app - 实时监测手机所有 App 的网络情况](https://github.com/agrinman/sift-ios)

Sift 是一个开源 App，可以监测手机上的所有网络请求，根据规则屏蔽请求，最重要的是：可以作为调试工具，在手机上实时看自己 App 的网络连接状态。

### [新一代 Swift ORM: Perfect-CRUD](https://mp.weixin.qq.com/s/I3yccTrUH7wDjb1j-6b_-A)

Perfect-CRUD 是基于 Swift 4 以上版本的关系数据库对象管理系统（ORM），采用Swift 4 Codable （可编码）协议映射到SQL类型的数据库表格。其采用了一种丰富多样又简洁明了的表达形式，通过类型模板（Generics）、字段路径（KeyPath）和可编码（Codable）的实现方式来确保编译阶段对数据类型的安全检查。
CRUD 是链式操作的（每个操作的结果都是可以继续作为参考进行下一步操作），它还提供了一个异步的日志系统用于记录错误以及每一条 SQL 语句。
有兴趣的可以到 [Perfect-CRUD](https://github.com/PerfectlySoft/Perfect-CRUD) 下载源码体验一番~

### [Lynx - 又一个跨平台开发框架](https://github.com/hxxft/lynx-native)

Lynx 是一个使用 Javascript 来构建 Android 和 iOS 应用程序的跨平台开发框架。Lynx 首选 Vue.js 作为开发框架，通过适配也可以使用其他前端框架进行开发。Lynx 是直接使用系统 UI 来进行渲染的，同时也支持使用 CSS 进行排版。据文档介绍，Lynx 不仅保留了类似 React Native 的动态特性和开发体验，还与 Flutter 有着相同流畅的性能体验。目前项目还处于 alpha 阶段，喜欢尝鲜的同学可以跑下工程的 demo 进行体验，对跨平台开发感兴趣的可以持续关注。

### [ZHNJSBox - 乞丐版JSBox](https://github.com/zhnnnnn/ZHNJSBox)

iOS 内置了 JavaScriptCore（戴铭前辈的『[深入剖析 JavaScriptCore](https://ming1016.github.io/2018/04/21/deeply-analyse-javascriptcore/)』为它作了很细致的分析），这为 JavaScript 与 Native 交互提供了很便利的基础。目前业内诸多跨平台方案，如 Weex 和 ReactNative 的 iOS 版本也都是通过 JavaScriptCore 实现的，还有一些动态化方案，如 JSPatch 等也是基于此。[JSBox](https://itunes.apple.com/cn/app/id1312014438) 是 iOS 上基于 JavaScript 的可扩展效率利器，它的 JavaScript 与 Native 间的通信同样也是依赖于 JavaScriptCore。

ZHNJSBox 是一名 JSBox 深度使用者为研究其实现而写的一个小项目，实现过程记录在了『[如何实现一个乞丐版 JSBox](https://juejin.im/post/5b1a21bb5188254fbb756b23)』一文中，该文还谈到了实现中遇到的一些技术瓶颈和如何借鉴 JSPatch 和 ReactNative 这类开源框架解决这些技术问题。如果对于如何利用 JavaScriptCore 搭建自己的动态化系统感兴趣，又苦于无从下手的话，这个开源项目是一个不错的入门选择。最后，如果仅是对 JSBox 实现原理充满好奇的话，这里再次推荐钟颖小专栏内关于 JSBox 的几篇文章 - 『[JavaScriptCore 与 Promise 那点事](https://xiaozhuanlan.com/topic/9631852407)』、『[使用 JavaScript 来写 Masonry 代码](https://xiaozhuanlan.com/topic/7143862059)』以及『[使用纯 JavaScript 编写 iOS 界面](https://xiaozhuanlan.com/topic/9786425031)』。

### [Swift 4.2 功能 Playground 全展示](https://github.com/ole/whats-new-in-swift-4-2)

Ole Begemann 大神出品的 What's New in Swift 系列，使用 Playground 为我们展示 Swift 4.2 的所有新特性，让大家可以直接上手感受。需要注意的是，现在 Swift 4.2 还在开发中，大家要使用的话需要安装 Swift 4.2 的工具链或者使用 Xcode 10.0 beta。

## 书

### [iOS 应用逆向与安全](https://item.jd.com/12361729.html)

@Alone_Monkey 的iOS逆向方面的新书，让读者不仅仅局限在各种逆向工具的使用上，而是从全局的角度，从原理的角度，来了解逆向与安全这个领域，并且还因为深入到了程序运行的本质从而加深更多iOS开发方面的理解。全书开篇1-3章，快速上手介绍了一些基础概念，逆向工具的使用。4-6章则全面系统的进行了知识储备与原理进阶。7-8章带着大家进行逆向实战与安全防护。非常推荐对逆向工程有兴趣的朋友们入手学习。

附带知识小集团队 @Lefe_x 的读书笔记一则：[《iOS 应用逆向与安全》读后感](https://mp.weixin.qq.com/s/uv-Bju1v1-y6TQntmHnCCg)，方便大家更好的初步了解书的全貌，不过还是推荐入手一本系统性的学习一下。

## 内推

### [字节跳动](https://job.toutiao.com/society) 北京 iOS 团队持续招人中

这是一家非常年轻的创业公司，充满活力与激情，只招优秀的人，一起做有挑战的事情。直接内推可以将简历及心仪岗位发送至我的邮箱 raozhizhen@bytedance.com，或者添加我的微信 jingmu1994 了解更多公司信息。有需要的我也可以直接帮你对接技术 Leader 详聊。

### [深圳头条研发中心诚招各路 iOS 好手一起做取悦自己的项目](https://job.toutiao.com/2018/spring_referral/?token=alPR8WCv8nnnc5QqtsyKjw%3D%3D&key=MTY1MDMsMTg0MTQsMjA1MjAsMTk1NjEsMTU2ODksMTc0ODk%3D)

如想了解更多深圳头条的信息，可以加小T微信：tomtan，切磋技术和聊情怀都可以喔~~~~

### [杭州/广州/深圳 奇志科技招聘 iOS、前端](https://www.lagou.com/gongsi/34872.html)

奇志科技自 2016 年起通过行业无人机协同工作流 Mesh 进入物联网与人工智能领域， 并成功为房地产、建筑、测绘、电力巡检等行业提供无人机解决方案。Mesh 在运用 yarn, rollup, vue 等技术栈的同时，利用 Couchbase 设计多端数据同步方案，并深入研究 React Native。也可以微博上私信 [@没故事的卓同学](https://weibo.com/u/1926303682) 了解。

### [百度教育事业部招 iOS 开发](https://www.baidu.com/s?wd=百度)

部门下面有百度阅读，百度文库，百度爱听等 App 产品。团队技术氛围浓厚，有兴趣的同学欢迎将简历发送到我的邮箱：lizelei@baidu.com。

### [上海-加入即刻](https://www.okjike.com/careers)

即刻 iOS 团队从一开始就使用纯 Swift 开发，至今已有三年多时间，是国内较早大规模使用 Swift 的团队。我们比较偏爱 RxSwift 和 Texture 等框架，追求和最优秀的工程师一起，用最高的标准做用起来最爽的 app。
如果你认识聪明勤奋、胆大心细、有追求的工程师，那就来加入我们吧！任何推荐或简历可直接发给Jason(即刻 iOS leader): jasy@okjike.com，或微博 [@JasonYuh](https://weibo.com/jasonyuh)。

## 关注我们

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

![](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)，[@mmoaay](https://weibo.com/u/1302422271)，[@享耳先森](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)

## 说明

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

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