# 老司机 iOS 周报 #75 | 2019-07-15

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


## 文章

### 🐎 [为什么Flutter是跨平台开发的终极之选](https://mp.weixin.qq.com/s/R0sk9CGPbBksSnWV9xtGSg)

[@CrazyCoderShi](https://github.com/CrazyCoderShi)：跨平台开发是当下最受欢迎、应用最广泛的框架之一。能实现跨平台开发的框架也五花八门，让人眼花缭乱。但目前最耀眼的非 Flutter 莫属。本文对 Flutter 进行了多个方面的分析，来阐述为何 Flutter 是目前跨平台开发的终极之选。

- 什么是 Flutter
- Flutter 特性
- Flutter 构建工具
- 使用了 Flutter 的热门 app


### 🌟 🐎 [基于小程序技术栈的微信客户端跨平台实践](https://mp.weixin.qq.com/s/V-H3pF9ytfXRhZG0PGIKsw)

[@莲叔](https://weibo.com/aaaron7)：跨平台是今年热点，本文简单讲述了微信使用小程序技术栈的跨平台框架演进之路，并且先后通过 lvcpp 以及 flutter 改造渲染底层来提升整体表现的性能。今年使用 flutter 渲染层+自定义上层 DSL 的尝试越来越多，不得不说是比较创新的一个思路，毕竟渲染层跨平台才是真正意义的跨平台。

### 🐕 [Web 和移动端需要掌握的布局方式 - Flexbox](https://mp.weixin.qq.com/s/WVqnmIbIkxsvBMhHydwHAg)

[@享耳先森](https://github.com/iblacksun)：布局一直是用户端开发的重点，`Flexbox` 布局解决了原来 CSS 盒子模型的一些不便之处。 `Flexbox` 已不止用于 CSS：如 Android 的 `FlexboxLayout`、ReactNative 所使用的 `yoga`，都支持 `Flexbox`。本文浅显的介绍了 `Flexbox` 的基本用法，建议阅读。

### 🌟 🐕 [关于iOS离屏渲染的深入研究](https://zhuanlan.zhihu.com/p/72653360)

[@老峰](https://github.com/GesanTung)：在平时的 iOS 面试中，我们经常会考察有关离屏渲染（Offscreen rendering）的知识点。一般来说，绝大多数人都能答出“圆角、mask、阴影会触发离屏渲染”，但是也仅止于此。

本文来自即刻技术团队，从 iOS 渲染架构开始深入的介绍了离屏渲染定义、常见离屏渲染场景、离屏渲染的性能影响，以及即刻团队对如何正确使用离屏渲染的思考、渲染性能的优化实践心得。

推荐阅读：
- [Mastering Offscreen Render](https://github.com/seedante/iOS-Note/wiki/Mastering-Offscreen-Render)
- [Getting Pixels onto the Screen](https://www.objc.io/issues/3-views/moving-pixels-onto-the-screen/)
- [Andy Matuschak关于离屏渲染的解释](https://lobste.rs/s/ckm4uw/performance_minded_take_on_ios_design#c_itdkfh)

### 🐕 [Swift vs Flutter - A side by side comparison for iOS development [Infographic]](https://blog.codemagic.io/flutter-vs-swift/)

[@张嘉夫](https://github.com/josephchang10)：在这篇文章里，作者逐一对比了 Flutter 和原生 iOS App（Swift）之间的差异。为了比较，作者构建了两个完全相同的 app，帮助你选择更符合你的需求的平台。具体来说，作者比较了两个平台的创建流程、构建时间、重新加载、Profiling、辅助功能、持续集成、App 尺寸等方面。如果觉得文章太长，也可以直接看文末的对比图。

### 🌟 🐕 [iOS 自动化测试标签生成工具接入指南](http://yulingtianxia.com/blog/2018/08/13/TBUIAutoTest-Usage/)
[@水水](https://www.xuyanlan.com/)：[TBUIAutoTest](https://github.com/yulingtianxia/TBUIAutoTest) 可以帮开发人员生成UI 控件的标签，便于自动化测试。只需一行代码或一个配置，几乎所有的 iOS Native UI 都会在运行时生成一个页面内唯一且不变的标签。不仅节省了开发人员手动为每个 UI 控件加标签的时间，也节省了测试人员与开发人员的沟通成本。目前已经有几十款 App 接入，其中包含 QQ、今日头条、兴趣部落、NOW直播等，有兴趣的读者可以尝试接入或学习实现哦～

### 🐢 [给 React Native 开发者的 Flutter 指南](https://mp.weixin.qq.com/s/MyFjQJqojviYJuQKf5MsGA)

[@looping](https://github.com/looping)：本长文分为上下两篇，从基本语法到布局动画，通过跟 React Native 作对比来帮助更多 RN 开发者快速入门 Flutter 开发。同时本文所列的一些基本概念和问题可以满足平时开发的大部分需求，可作日常开发参考，建议收藏。

### 🐕 [Swift Property Wrappers](https://nshipster.com/propertywrapper/)

[@Damonwong](https://github.com/Damonvvong)：要说 Swift 5.1 最期待的特性，那就非 **Swift Property Wrappers** 莫属了，把原先兼容 Objective-C 的 **@** 终于解放出来了，赋予了更多能力。NSHipster 的这篇文章就很好的解释了 **Swift Property Wrappers** 是什么以及可以怎么用。大概列举了一下几个用处：

- 约束变量值
- 修正输入的值。比如过滤输入值中的空格。
- 修正比较逻辑。比如忽略字符大小写进行比较。
- 记录值的变化

当然还有一些限制，比如无法参与错误处理、不能被别名、多个 **Property Wrappers** 难以组合、第一类型不能直接依赖 **Property Wrappers**、文档写起来很难、使 Swift 更加的复杂等等。

### 🐕 [UIStackView](https://nshipster.com/uistackview/)

[@zvving](https://github.com/zvving)：早在 iOS9 苹果就引入 UIStackView 来支持类似 Flexbox 的容器布局概念，最新发布的 SwfitUI 中也有对应 HStack、VStack、ZStack 的定义。如果你还没使用过这一简单而又灵活的布局方式，强烈推荐 NShipster 刚发布的这篇入门文章。


## 工具

### [UIKit equivalent in SwiftUI](https://goshdarnswiftui.com/)

[@Parsifal](https://weibo.com/parsifalchang)：SwiftUI 吸引了众多开发者尝试，这个网站整理了关于新手入门 SwiftUI 需要了解的一系列东西。包含：

- SwiftUI 的高频 FAQ
- UIKit 与 SwiftUI 的组件对照表
- SwiftUI 视图和控件简单介绍和使用
- SwiftUI 复杂布局介绍和使用
- 如何在 SwiftUI 中集成 UIKit 组件
- 如何在 UIKit 中集成 SwiftUI 组件
- 优质学习资源链接

如果你刚接触 SwiftUI，这个网站可以帮你更快速地掌握基于 SwiftUI 的 App 开发，也可以作为平常开发中的速查表使用。

> 由喜欢瞎倒腾的 [Liaoworking](https://github.com/Liaoworking) 推荐

### [Visual-Regular-Expression](https://github.com/White-White/Visual-Regular-Expression)

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：`Visual-Regular-Expression` 是使用 Swift 实现的正则解析引擎，将解析结果转换成 NFA，并动态展示每一步的匹配过程。它可以帮助你更好的理解正则和 NFA 的运行原理。

### [CocoaPods 历险 - Resolver 仲裁入口解析](https://mp.weixin.qq.com/s/o-v41MlTAX2Oeg_BeSLKEw)

[@xiaofei86](https://weibo.com/xuyafei86)：在系列文章 [CocoaPods 历险 - 总览](https://www.desgard.com/cocoapods-1) 中我们得知了 CocoaPods 组件的构成和职责，以及 pod install 命令执行后 prepare、resolve_dependencies、download_dependencies、validate_targets、generate_pods_project 过程的总览。其中，resolve_dependencies 过程中包含了 Resolver 的入口过程以及 Molinillo 仲裁算法，本篇文章则以 入口过程的解析为主题展开。后续会具体深入到 Molinillo 图算法中去认识仲裁流程。

## 代码

### [Swift-30-Projects/Project 04 - TodoTDD](https://github.com/soapyigu/Swift-30-Projects/tree/master/Project%2004%20-%20TodoTDD)

[@Parsifal](https://weibo.com/parsifalchang)：iOS 专家[故胤道长](https://weibo.com/soapyigu) 在读完 [Test-Driven iOS Development with Swift 4](https://www.amazon.com/Test-Driven-iOS-Development-Swift-maintainable/dp/1788475704) 一书后尝试写了个 ToDoList 的 Demo App 来应用这门技术。这个简单的例子包含了如何写单元测试、UI 测试、网络层测试和数据层测试等等。整个 App 的测试覆盖率达到了 91.9%。

> [Swift-30-Projects](https://github.com/soapyigu/Swift-30-Projects) 是[故胤道长](https://weibo.com/soapyigu) 在维护的一个基于 Swift 的开源仓库，内容包含如何使用 Swift 开发常规 iOS App、各类开源框架、设计模式以及 TDD 等。如果你正在入门学习 Swift，这个仓库可以帮你更快了解到 Swift 老手们是如何使用 Swift 开发 App 的。

> 关于 TDD 的入门，可以参考周报 [26 期](https://github.com/SwiftOldDriver/iOS-Weekly/blob/59bfdf3859a67d5667319000e4ee70f8f9cd6f76/Reports/%2326-2018.07.09.md)推荐过的 [Test Driven Development Tutorial for iOS: Getting Started](https://www.raywenderlich.com/185640/test-driven-development-tutorial)。

## 内推

老司机周报团队联合知识小集和 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 。

## 说明

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

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


