老司机 iOS 周报 #43 | 2018-11-12

2,999 阅读14分钟

老司机 iOS 周报,只为你呈现有价值的信息。

你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。

小专栏

From Swift To C++

来自微信团队的周报编辑芒果最新出炉的一篇文章。这篇文章按照编程范式(programming paradigm)来组织脉络,从一个客户端工程师的角度来品味和对比这 Swift 和 C++ 两门语言。如果你也在或者即将同时把 Swift 和 C++ 当做主流编程语言,那么这篇文章你绝对值得一看。

新闻

适用于触控问题的 iPhone X 显示屏模块更换计划

号外!号外!继“降频门”事件引起的 218 元换电池服务后,苹果又出免费更换 iPhone X 显示屏服务了。只要你的 iPhone X 经过测试满足以下两个问题,则苹果会替你免费更换显示屏。

  • 显示屏或显示屏的一部分不响应或间歇响应触控操作。
  • 即使没有进行触控操作,显示屏也会作出反应。

另外友情提醒,218 元换电池只剩最后一个半月了,还没换的小伙伴抓紧上,绝对能让你的老设备焕然一新!

文章

🌟 🐕 Language Server Protocol

前段时间 Apple Swift 团队在 Swift Forum 上宣布他们会对 Swift 和 C 系列语言(C/C++/ObjC)增加 LSP (Language Server Protocol)支持。这对于饱受 Xcode 折磨的开发者来说是个极大的利好,意味着在这之后可以有更多的第三方 IDE 支持。

Matt 的这篇文章,解释了什么是 LSP,LSP 是怎么工作的,以及潜在的可能带来的好处。

虽然 Swift 支持 LSP 的具体时间表到现在还没有放出来,但是受苦于 Xcode 的大伙们也算是有点盼头了。

🌟 🐎 Tricks & treats to make UI testing less terrifying

part1part2part3

自动化测试,尤其是 UI 的自动化测试,对于国内大部分的开发者应该都是“只闻其声未见其人”的感觉,知道有这么个事儿,但基本都没怎么实践过。这一系列文章系统性的讨论了 UI 自动化测试的最佳实践。从如何标记 UI 元素到如何访问,最后在第三部分还探讨了一种编写 UI 测试的“设计模式”,名叫 PageObject 的编程模型,来提升 UI 测试代码的可维护性。

🐎 Stephen King's Advice To Software Developers

斯蒂芬·金,《肖申克的救赎》的作者。他曾在《On Writing》一书说,讲述了他的写作经验。学习技巧基本相通,因此本文作者将斯蒂芬·金的经验融合到软件开发实例中。

  1. 多输入,多输出
    • 多输入:多看源码,CodeReview,博客,书籍,如无从做起,可多关注老司机周报
    • 多输出:对于想掌握的技巧,多进行刻意练习。
  2. 避免分心
    • 规划时间,固定的时间做固定的事情,效率更高。
    • 寻找专门的空间和可以集中精神的 2 个小时
  3. 闭门,开门
    • 专注开发完成后(闭门),接受 CodeReview 或者开源,吸纳更多的意见进行优化(开门)。
  4. 杀掉你的所爱
    • 每次优化,果断删掉你自豪但无用的代码,炫技不如贴合业务。
  5. 花时间
    • 没有捷径,务必坚持(但是要注意学习技巧)。

🚧 🐕 How to remove duplication from Swift tests with helper functions

对于 XCTest 的单元测试来说,提取重复代码对于开发者而言并不友好,可能会出现如下几种问题:

  1. 执行过程中,Xcode 的断言函数停止在了提取函数内部。
  2. 多个单元测试同时报错时,需要展开错误信息才能了解到具体信息。

为了解决如上几个问题,作者巧妙的运用了 Swift 中 XCAssert 函数的另外两个入参 fileline,来传递辅助函数调用时的文件和行号,这样 Xcode 就能够帮助你将错误信息正确提示到辅助函数调用的地方。

🐕 Keeping your code clean

写得一手好字,对于普通人来讲是一个很好的加分项,而是否写得一手简洁漂亮的代码则对于我们开发者来说更为重要。招聘单位往往对应聘人的代码风格都会有一定要求。本文分享了如何写得一手好代码的几个小技巧,很值得大家关注,并在平常开发中重视起来。

  • LOC(Lines Of Code):代码应该足够精简,函数是最小的执行单元,避免冗长的代码集中在一个函数实现上。
  • 正确的缩进:不管你是 “Tab” 党还是 “空格” 党,合适的缩进能让你的代码排版更加整齐,让人读起来更加舒适。
  • 标准的命名:虽然命名一直是程序员的难题,但我们仍然需要能够很好的名字来提高我们代码可读性。
  • 变量和函数的声明:在合适的地方做声明,按照功能进行分组。
  • 代码风格:每个团队都应该有一套代码规范,来统一团队成员的代码风格。

另外,该作者还在最后为我们推荐了几个 Lint 的工具,可以帮助我们自动化代码规范审核,如 SonarQubeTailor 以及 SwiftLint

🐕 String’s ABI and UTF-8

近日,Michael Ilseman 在 Swift 社区论坛发文 String’s ABI and UTF-8 表示 String ABI 相关改动已提交到 master 分支。具体来说,这是底层实现的一次显著改动(这些改动在 API 层面无任何影响),其中最主要的一点就是原生 Swift 字符串会统一使用 UTF-8 进行存储(在内存里),而之前是根据内容选择 ASCII 或者 UTF-16 进行存储。

文章还特地提到:传统意义上中文字符串是 UTF-8 性能最差的场景(需对多个 UTF-8 编码进行重排合并得到 Unicode 码位),得益于现代 CPU 的改进,这些已不再是问题。

🐢 Result<T> 还是 Result<T, E: Error>

API 的错误处理一直是 Cocoa 做的不好的一部分。到了 Swift 时代,我们有了更好用的 enum,可以帮助我们统一 Data 与 Error 的封装。如果你常用 Alamofire,一定对它的 Result<T> 非常熟悉,对于错误,它仅要求满足 Swift.Error。但是很多时候处理这个空协议依旧不是最方便。于是又有人提出了 Result<T, E: Error> 来指定错误类型,大部分情况下你会在这里定义一个 enum 来穷举所有可能的错误(注意这里的错误是 Error 而非 Swift.Error)。喵神在文中详细对比了这两种方式的利弊。

当然,官方不可能对这一不足置之不理,相关的提案 SE-0235: Add Result to the Standard Library 本周已经在讨论中,相信结果很快就会出来,让我们拭目以待。

🐢 KVC/KVO 总结

对 KVC / KVO 做了到位的总结和代码示例。相信对想要详细了解或使用 KVC / KVO 的同学会有所帮助。

KVC

  • Key-Value Coding基本原则
  • 访问对象属性
  • 访问集合属性
  • 访问者搜索模式

KVO

  • 注册KVO
  • 兼容KVO
  • 注册从属keys
  • Key-Value Observing 的实现细节

🐢 Category 特性在 iOS 组件化中的应用与管控

关于组件化,在业界的文章和讨论已经很多了。但组件化其实是一个比较大的工程化问题,对于想要使用和已经采用组件化进行开发的团队来说,对于实施组件化的很多细节,其实很多文章并没有说的很清晰。本文主要围绕组件分层通信解耦的机制,先后列举了常见的几种方案对比,以及美团所采用的方案:Category+NSInvocation 和 CategoryCoverOrigin。对于这两个相对陌生一些的方案,文中也有一定的介绍,并且写了实际运用的代码,对此有兴趣的同学推荐可以认真看一下本文。最后,Category 的使用笔者一向认为需要比较慎重,否则往往会带来更坏的效果,至于采用哪种方案,就看大家自己的抉择了。这里并没有打太极的意思,而是对于组件分层通信,怎么做、是否要做到如此,以及各种方案所带来的代码量的增加和后期的维护成本是否值得,不同的团队也会有不同的见解。

🐕 Void

NSHipster 介绍了很多和 Nothingness 相关的内容。这篇文章主要介绍的是 Swift 中的 Void。文章内容依旧是 Mattt 大神的写作三部曲:

  • Void 在标准库中的运用

    描述了 Swift 标准库在设计 ExpressibleByNilLiteral 的时候,如何巧妙的运用 Void 避免了和默认 init 冲突的情况。

  • Void 一些被忽略的细节

    比如 Void 是一个 non-nominal 类型,如何在无法拓展的情况下如何相互比较、一些自相矛盾的写法等

  • Void 实际开发中的秒用

    以网络请求为例,在使用 Void 的情况下,巧妙的把 completion(.success(())) 改成了 completion(.success)

🐎 Swift Tip: Lightweight Observation

对于静态视图结构和动态数据,我们可以使用内建的 didSet 属性观察器来观察数据的变更,并对应更新视图。这项技术的优势就在于简单性:不需要引入响应式框架、KVO 或其他东西。这篇文章用一个实际的例子演示了具体的做法。

🐕 Swift 5 and ABI stability

Swift 5 的分支最近已经准备要合并到主干了,这一次合并意味着 ABI 在 Release 之前不会有大改动,并且在未来版本保持 ABI 的向后兼容性。

所以最近在 Swift 论坛上也能看到核心团队加快节奏在调整精简标准库的 API,包括加入 Contiguous Collection Protocols 确立数组内存布局以便优化排序等操作,去除掉 Sequence.SubSequence 以便提升数组切片效率等等。

如果你还不了解 ABI 相关的内容,那么可以看看这篇文章,了解一下 ABI 稳定对我们日常开发的影响。

🐢 【译】给 iOS 开发者介绍 Flutter

本文是 Flutter for iOS 官方指南的翻译。iOS 知识和技能对 Flutter 开发非常有价值,如果你已经有 iOS 开发经验,可以通过这篇文章,用自己已有的 iOS 知识去使用 Flutter 构建应用。

文章主要介绍 UIView、UIViewController 等 iOS 常见知识在 Flutter 中怎样使用。共包含 12 个章节:View、页面导航、线程和异步、工程结构/本地化/依赖和资源、ViewController、布局、手势检测和 Touch 事件处理、主题和文字、表单输入、与硬件交互/第三方服务和平台、数据库和本地存储、通知。

作为给 iOS 开发者的入门 Flutter 的文章,本文内容全面,也可以作为开发手册来查阅。另外,作者还翻译了 给 Android 开发者介绍 Flutter,有兴趣可以阅读。

设计

Photopea: advanced image editor

Photopea 是一款免费的在线 Photoshop(替代品),拥有和 PS 几乎相同的界面和快捷键,并且支持多语言,已经有超过 150 万独立访客。

工具

手机上的抓包神器 Stream

配置简单,不需要改代理等繁琐操作,即可

  1. 抓取手机上的 HTTP & HTTPS 请求和响应,方便开发和测试人员快速定位线上问题。

  2. 重放和构建请求,高效调试服务端接口。

  3. 支持在 iOS 上实现配置 Hosts 的效果,方便产品和测试切换线上和测试环境。

  4. 集成一些常用工具,如 URL Decode/Encode,md5,base64,时间戳转化等。

另一款轻量级的 UI 实时调试工具 - Sherlock

这是除 Reveal 外又一款支持实时调试 UI 的工具,相比于 Reveal,Sherlock 虽然没有 Reveal 那么强大的功能,但它更加轻量级,且无需任何配置,打开模拟器和 Sherlock 就可以直接使用。此外,它还支持调整屏幕大小以测试你的 UI 在各类屏幕上的展示效果,不需要你去启动各种模拟器。目前 Sherlock 正处于 Beta 测试中,暂时只支持 iPhone 模拟器。

SmartBaby

SmartBaby 是一款提高 Swift 开发者效率的工具。它能从 JSON 推断出 Codable 模型,且具有好用的自定义功能。创建的模型可按照 Project 分组,并使用 CloudKit 存储在 iCloud 的私有数据库中。

由 SmartBaby 开发者 @nixzhu 自荐

代码

AloeStackView

AloeStackView 是一个类似垂直 UITableView 的类。它着重于让 UI 的实现变得非常的快速、简单和直接。不过为了实现更简单、更安全的API,它放弃了 UITababieView 的一些特性,如视图循环。

特性

  • 允许您保持对视图的强引用并动态更改其属性,而自动布局让 UI 实时更新。
  • 允许视图动态添加、删除、隐藏和显示,并提供可选动画。
  • 包括对视图间可定制分隔符的内置支持。
  • 提供可扩展的 API ,允许添加专用功能而无需修改 AloeStackView 本身。
  • 在高流量的 iOS 应用程序中广泛使用和审查。
  • 小的、易于理解的代码库(在500行代码之下)没有外部依赖性,调试轻松。

音视频

LEARN TALKS AWESOME CONFERENCE AND MEETUP TALK

顾名思义,learntalks 是一个学习如何 talk 的网站,面向技术人员。网站收录了技术领域时下热门的技术大会的演讲视频,其语言涵盖了 Swift,Kotlin, Javascript 等,颇有一种足不出户就能阅遍天下大会的感觉,学技术和学 talk 同时进行。推荐关注。

Flutter 免费视频教程第一季:开发环境搭建

手把手带你配置 Flutter 开发环境的视频教程,除视频外作者还编写了非常详尽的文字教程,对正在入坑 Flutter 的小伙伴可以看看。

内推

关注我们

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

同时也支持了 RSS 订阅:github.com/SwiftOldDri…

本期编辑

@四娘@享耳先森@Damonwong@折腾范儿_味精@张嘉夫@AidenRao@Parsifal@aaaron7@方秋枋@kyo@tom510230@anotheren@水水@looping@老老老老老老老驴@小非86@邦ben@红纸@含笑饮砒霜@JimQ

说明

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

预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)