# 老司机 iOS 周报 #61 | 2019-04-01

![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 5 正式发布](https://mp.weixin.qq.com/s/-fLVdoTz3lT5Kxnea0-Avg)

Swift5 正式更新，官方提供了更新笔记说明，我们周报编辑团队的 [@Tom](https://xiaozhuanlan.com/u/6682065345) 组织 [@老老老老老老老驴](https://weibo.com/u/6090610445)，[@小非86](https://weibo.com/xuyafei86)，[@邦ben](http://weibo.com/linwenbang) 和 [@极速男孩](https://github.com/ztlyyznf001) 为大家做了第一手的翻译工作，方便大家了解这次对于 Swift 发展史很重要的迭代。

### 🌟 [支付宝移动开发平台 mPaaS 正式向个人开发者开放](https://fw.alipay.com/alipaymarket/ability/AM010000000000002935/detail.htm)

mPaaS 是支付宝移动开发所依赖的平台服务，它承载了支付宝这种超级 App 的日常迭代。过去半年左右的时间，mPaaS 持续向社区输出自己的一套软件开发和管理方案。之前 mPaaS 服务只对企业级用户开放，而这周支付宝宣布这套开发平台也正式向个人开发者开放。个人觉得，就算不使用这个平台服务，通过浏览其功能的相关文档和接口规范，也能获得不错的收获。

### [Shortcuts 2.2 Brings New Apple Notes Actions, Travel Time Enhancements](https://www.macstories.net/ios/shortcuts-2-2-brings-new-apple-notes-actions-travel-time-enhancements/)

在苹果将 Workflow 纳入自家门下之后，越来越多的 私有 API 开放给了捷径应用。就在本周，捷径发布了其 2.2 版本。原先需要打开 Notes APP，再进行捷径操作。如今已变成了后台 API 访问的形式。除此之外，还增强旅行时间功能，其基于 Apple Maps，有更多的变量可以让你去选择，例如时长、距离、最佳路线等。

## 新手推荐

### 🌟 [代码自解释不是不写注释的理由](https://www.infoq.cn/article/eQlxAX013D9h5b-B356Q)

代码注释通常有两种形式：要么没有和要么毫无用处 。作者认为`自解释的代码是不存在的` ，应该让注释成为代码的一部分。如果你对代码注释有任何疑问，推荐阅读此文。

### [Swift 4.2 improves Hashable with a new Hasher struct](https://www.hackingwithswift.com/articles/115/swift-4-2-improves-hashable-with-a-new-hasher-struct)

Swift 4.2 优化设计了 Hashable 协议，引入了新的 default implementation `func hash(into: inout Hasher) `，并以 Hash-flooding 攻击为知识背景详细介绍了为什么 Apple 官网文档不建议继续使用 `var hashValue` 的原因。

> @[sunsetwan](https://github.com/SunsetWan) 推荐

### [Swift, more elegant code: Typealias](https://medium.com/@ahmadfayyas/swift-quick-elegant-code-typealias-8e6d59f07f32)

本文作者使用两个例子，一正一反，运用对比论证的手法，生动形象地说明了 Typealias 的恰当用法。
别名的使用，在于将很长的声明类型缩短，增加可读性。常用于在 Swift closure （类比 Objective-C block `typedef` 场景）。

```
typealias Success = (_ data: Data, _ message: String, _ status: Int, _ isEnabled: Bool) -> ()
```

> @[sunsetwan](https://github.com/SunsetWan) 推荐


## 文章

### 🌟 🐢 [Flutter 实现原理及在马蜂窝的跨平台开发实践](https://mp.weixin.qq.com/s/WBnj_6sOonjR9XUnB-wZPA)

马蜂窝团队根据他们对 Flutter 在马蜂窝商家端的一个小尝试，总结了他们对 Flutter 一些看法。文章主要分为三个部分：

- 第一部分，主要说了马蜂窝为什么想尝试 Flutter 技术，并总结了 Flutter 基本架构和实现原理
- 第二部分，主要讲了 Flutter 在马蜂窝商家端 App 中的应用实践，如何在两端集成、如何交互以及部分性能对比。
- 第三部分，主要总结了如何管理「页面混合栈」以及对 Flutter 应用总结。

如果还没有开始尝试 Flutter 朋友，这会是一篇很不错的参考文章哦。

### 🌟 🐕 [VIPER best practices for iOS developers](https://theswiftdev.com/2019/03/11/viper-best-practices-for-ios-developers/)

本文是作者在过去一年对 VIPER 架构最佳实践系列分享的第二篇。主要包括以下内容：

1. 使用 VIPERA 代码生成工具自动生成 VIPER 各个模块
2. 以 App 首页业务为例结合 Promises 分别实现 View、Interactor、Presenter、Entities、Router 、Services
3. VIPER 模块间通信

结合 Promises 基于 VIPER 架构可以使代码结构更加清晰，更容易做单元测试，更易复用，[点击这里](https://github.com/theswiftdev/viper-best-practices/)阅读源码。

对 VIPER 架构感兴趣的读者可以扩展阅读作者这个系列教程[第一篇：](https://theswiftdev.com/2018/03/12/the-ultimate-viper-architecture-tutorial/)各种架构及 VIPER 基本概念，[第三篇：](https://theswiftdev.com/2019/03/19/mastering-the-viper-architecture/)面向协议编程在 VIPER 架构上的实践。

### 🌟 🐕 [iOS 开发中的 Web 应用概述](https://dequan1331.github.io/web-in-ios.html)

移动开发领域近年来已经逐渐告别了野蛮生长的时期，进入了相对成熟的时代。而一直以来 Native 和 Web 的争论从未停止，通过开发者孜孜不倦的努力，Web 的效率和 Native 的体验也一直在寻求着平衡。本文聚焦 iOS 开发和 Web 开发的交叉点，希望能通过简要的介绍，帮助开发者一窥 Hybrid 和大前端的构想。

### 🐎 [CodeHub#1 回顾 | 敏捷开发与动态更新在支付宝 App 内的实践](https://mp.weixin.qq.com/s/eXzojM0lCaaCW4JxBaU6BQ)

本文解释了支付宝 App 的一些架构实现细节，支付宝的架构设计需要满足的目标有

- 多应用的生态：不限于形式，原生模块、离线包、小程序。
- 开放：底层同一个架构，业务很方便的迁移。
- 动态化：业务可以随时在线更新，无需发版，随时响应线上活动，比如双十一、双十二，春节扫福等活动
- 高可用、高性能、高灵敏度：完善的监控运维体系、发现问题后多层次的修复技术、客户端良好的性能启动体验，强大的网络性能，防刷抗流量等。

从整体上来说，一个超级 App 的发展过程，对于前后端的架构设计都会提出不同的演化目标。目前支付宝也开源了面向移动开发的一站式解决方案 mPass，能有效地减少研发成本，提升开发效率，可以多关注一下。

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

令 Swift 程序员们热泪盈眶，翘首以盼的 Swift5.0 已经发布了，带来了 ABI 稳定等一系列激动人心的特性。按照 Swift 一贯的节奏，当一个版本发布时，人们往往就已经开始关注下一个版本，比如这篇文章为我们简单的介绍了一下 Swift5.1 中目前已经基本确定的新特性，比如 Self 的新用法，optional 枚举的匹配以及数组的 difference 直接计算等，个人觉得最好玩的应该是最后一个点。基于这个特性应该可以做很多有趣的文本应用。感兴趣的同学可以仔细看看文章。

### 🐎 [Deep dive into Pattern matching with ~= operator](https://mecid.github.io/2019/03/20/pattern-matching-operator/)

Swift 中的 `switch-case` 语句非常强大，灵活配合 `turple`, `case let`, `where` 能写出可读性很高的代码。

但是，你知道 `switch-case` 语句模式匹配的具体过程吗？是否支持自定义类型？标准类型的模式匹配如何扩展？你可能想不到，简单的重写 `~=` 运算符就能实现这些强大的功能。本文带你快速了解这一模式匹配过程。

### 🐢 [XcodeKit and Xcode Source Editor Extensions](https://nshipster.com/xcode-source-extensions/)

Xcode 8 提供了 Xcode Source Editor Extension方式来开发 Xcode 插件。本文详细介绍了插件的制作过程如 Menu Items 设置、XcodeKit Inputs and Outputs 处理、以及一些开发调试中的一些 Tips 等。在往期周报中已有不少相关内容的推荐，对 Xcode Extensions 感兴趣的读者不妨一看。

> 推荐阅读： 
> 1. [How to convert your Xcode plugins to Xcode extensions](https://medium.freecodecamp.org/how-to-convert-your-xcode-plugins-to-xcode-extensions-ac90f32ae0e3) 
> 2. [制作一个 Mac APP：XcodeExtension](https://juejin.im/post/5c53f32be51d457fbe226fdd)
> 2. [Code Friend](https://github.com/qvcodefriend/CodeFriend) 

### 🐢 [How to implement service oriented architecture using swift](https://itnext.io/service-oriented-architecture-in-swift-362dc454fc09)

基于服务的架构是一种组件模型，它将应用拆分成多个功能单元（服务）暴露给上层进行调用，并通过这些服务之间定义良好的接口和契约联系起来。

这篇文章讲的就是这种架构在 iOS 里的使用，作者讲述了他对于服务的定义，接口的构建，架构具体的分层，依赖注入的实现，并且基于这一套理论实现了一个用户信息管理功能。

## 工具

### 🌟 [通过异步生成 dSYM 实现极速打包](https://github.com/bestswifter/blog/blob/master/articles/async-dsym.md)

对大型应用来说，进行编译打包通常比较耗时。通过对编译时间的分析可以发现，大约有两分钟的时间用于生成 dSYM 文件，也就是 Release 模式下的符号表。为了不阻塞编译构建，dSYM 可以通过异步的方式去生成。具体的做法为：

1. 将一次编译构建拆分为两次
2. 第一次编译不生成 dSYM 文件
3. 第二次编译再生成 dSYM 文件，由于使用了相同的代码和缓存，因此速度非常快

当前这个工具仅用于修改 UUID，不区分是否是 dSYM 文件，且仅支持 armv7 和 arm64 架构。

### 🌟 [LLDB 知多少](https://juejin.im/post/5c8ca84ce51d456f43189dbd)

LLDB 是我们 iOS 开发最为熟悉的调试工具了，本文就从 LLDB 基本概念和它的命令结构展开，总结了几个常用的调试命令，同时也介绍了两款功能强大的 LLDB 插件，让我们重新认识了 LLDB。正如作者所希望的，在大家了解了 LLDB 之后，还是要通过不断的练习来掌握更多的调试技巧，进一步提高开发效率。

### [DevSwitch](https://github.com/aaronpearce/DevSwitch)

一款可以快速切换应用商店的地区，来查看你的应用的评论和功能的工具。

## 代码

### [flutter_flipperkit](https://github.com/blankapp/flutter_flipperkit/blob/master/README.zh_CN.md)

随着 Flutter 的热度不断增加，社区相关的工具库也在不断增加。如果之前有开发过 RN 的同学可能知道 blankapp 这个团队，他们为 RN 开发了很多易用的组件之前。目前，他们团队也开始为 Flutter 开发一些工具，flipperkit 这个工具主要用来在开发过程中方便的进行 debug，支持网络信息、UserDefaults 信息的查看等等，而且集成安装很方便，推荐大家尝试。

## 音视频

### [ggtalk | 如何出版一本书](https://talk.swift.gg/23)

本期 ggtalk 邀请的嘉宾是曾经在人民邮电出版社担任过文字编辑和线上运营工作的刘女士以及《Xcode 江湖录》的作者星星。围绕“如何出版一本书”这一主题，本期讨论的内容（按照时间顺序）大致分成三个部分：

1. 介绍图书出版的流程以及回答稿酬计算方式等关于出版图书的一些相关问题
2. 星星和梁杰的出书和翻译经历
3. 关于国内的出版现状，电子书和“碎片化阅读”的讨论

本期的讨论对想自己出书或是翻译国外图书的朋友有比较大的帮助。

## 内推

老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。

如果你想**找工作**，点这里：https://www.yuque.com/iosalliance/article/bhutav

如果你想**招人**，点这里：https://www.yuque.com/iosalliance/article/ycyhf3

当然，也欢迎你关注我们每一期的周报，我们会在每期周报底部及时更新编辑内推岗位。

## 关注我们

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

![](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://github.com/Damonvvong)，[@折腾范儿_味精](http://weibo.com/agvicking)，[@张嘉夫](https://weibo.com/2949394297)，[@Parsifal](https://weibo.com/parsifalchang)，[@aaaron7](https://weibo.com/aaaron7)，[@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)，[@老峰](https://github.com/GesanTung)，[@zvving](https://github.com/zvving)，[@J_Knight_](https://github.com/knightsj)，[@极速男孩](https://github.com/ztlyyznf001)

## 说明

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

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


