老司机 iOS 周报 #45 | 2018-11-26

2,807 阅读10分钟

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

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

小专栏

Swift 开源项目精选导图

这份文档主要基于微博 @SwiftLanguage 跟踪过活跃于 Swift 语言领域的那些 GitHub 开源项目,顺便也是对于过去几年关注的内容进行一次系统化梳理。尝试整理出一份相对结构化且精练的 Swift 开源项目参考知识库,它将主要以思维导图形式呈现。

文章

🌟 🐢 Hades:移动端静态分析框架

本文介绍了大众点评基于 Objective-C 的代码静态分析工具 Hades 的研发经验,重点解决了以下痛点:

  • 开发成本高,收益有限,研发参与积极性不够。
  • 针对局部代码分析,跨编译单元以及全局性分析较难。
  • 增量分析困难,CI 静态检查效率低下。
  • 工具性较强,大部分只作代码规范检查,应用范畴局限。
  • 接入和维护成本高,难以平台化。

Hades 相对于市面上已有的工具,在研发端解决了代码检查规则维护困难的问题,在 CI 端解决了性能问题,因为针对每次检查都可以持久化 Model 对象,在扩展性上还有很大的想像空间,大众点评团队为我们提供了很好的代码静态分析工具研发思路。目前 Hades 还是闭源阶段,将来有可能转为开源。

P.S. 目前iOS平台上的代码静态分析工具一览表 SwiftLint Appscreener Checkmarx Fortify Infer oclint Veracode

🐕 Swift Development with Visual Studio Code

Swift 在早些时候宣布将支持 LSP(Language Server Protocol),整个社区都沸腾了。人们涌上街头,奔走相告,一遍遍的确认着:我们可以摆脱 Xcode 了吗?VSCode 作为 LSP 支持的先驱者与佼佼者,目前基本已经是行业排行第一的通用型代码编辑器。

本篇文章由 mattt 大神出品,详细介绍了怎么在 VSCode 中配置 Swift 的开发环境。目前虽然 Swift 的 LSP 支持还处于 early stage,但已经可以支持最常用的自动完成、快速帮助以及跳转定义等功能。并且基于 VScode 强大的插件生态,还有 SwiftLint 这样的插件可以来提升代码的风格优化。不得不说,人们对于 Swift,尤其是非 Apple 生态下的 Swift 开发体验跨越式升级,已经发生。

🚧 🐢 Xcode and LLDB Advanced Debugging Tutorial

作者准备了一个简易项目,演示了如何利用 Xcode 和 LLDB 进行高级调试。

  • 第一部分 在断点处添加调试命令,注入一行新代码进行调试。

  • 第二部分 通过给属性添加观察点,当其变化的时候,会中断程序,观察到属性变化的前后值,及可以进行堆栈追踪。

  • 第三部分 在断点中,通过调试命令新增新的断点,使断点在某些场景下才开始执行,更高效的追踪问题。

🚧 🐢 A taste of MVVM and Reactive paradigm

本文通过一些简单的类讲述了什么是 MVC 和 MVVM,以及如何进一步研究 Rx。您可以自由地创建自己的架构,但无论您做什么,一致性都是关键,不要让别人看的时候感到困惑或惊讶。

所有设计模式的简单原则可总结为:

  • 确定应用程序的各个方面的变化,并将它们与保持不变的方面分开
  • 编程到接口,而不是实现
  • 组合好过继承

希望本文对正在为架构选型而头疼的朋友有所帮助。

🐕 实用的可选项(Optional)扩展

OptionSwift 最基础的内容,它迫使开发者们处理好一些临界情况,使得程序更加健壮。标准库中 Option 的 API 非常少,编码过程中通常需要配合 if let guard let 一起使用,这容易造成多分支。作者参考了 Rust Scala 等语言的实现,给出了一些 Option 扩展,或许你可以用于自己的项目中。

🚧 🐕 Stubbing in pair with Swift compiler

Unit tests 中 stubbing 是一个很常见的做法,现在也有很多成熟的框架。而本文却从另外一个角度来做: 利用 Swift 的语言特性来做另类的轻量级的 Stubbing。 这种做法的应用面虽然比较有限,但是不妨可以了解一下作为参考。

🐕 关于 performSelector:afterDelay: 的一个坑及思考

本文通过对于 performSelector:afterDelay: 函数进行了研究,总结了以下三点内容:

  1. 在一个没有开启 RunLoop 的子线程中调用 performSelector:afterDelay: 函数,最终是不会被执行的
  2. 看似相近的 API,可能不是同一个模块提供的,其实现方式也不尽相同
    • performSelector: 来自于 NSObject.h,其是有 id 类型的返回值,并不依赖于子线程的 RunLoop 开启状态
    • performSelector:withObject:afterDelay: 来自于 NSRunloop.h,其并没有返回值,依赖子线程的 RunLoop 开启状态
    • performSelectorOnMainThread:withObject:waitUntilDone: 来自于 NSThread.h,其并没有返回值,依赖主线程的 RunLoop 开启状态
  3. performSelector: 中函数定义在其他地方就会引起编译警告,如果函数没有返回值可以使用 performSelectorOnMainThread: 或者 performSelector:withObject:afterDelay: 来避免编译警告

🐕 函数式编程 - 有趣的 Monoid(单位半群)

本文介绍了在函数式编程中比较核心的一个概念 Monoid(单位半群)。从半群到单位半群,从数学定义到 Swift 的展开实现,以引导教学的方式带领读者一步步深入了解 Monoid,极易消化理解。后半部分介绍了几个有趣实用的 Monoid 类的数据结构,且都有递进式的概念讲解及 Swift 实现。

另外,本文是近两年来作者关于函数式编程系列文章中的最新一篇。本系列文章同样都是采取引导递进式的行文风格,作者从 Haskell 这种标准化的、通用纯函数式的编程语言中汲取灵感,将诸多函数式编程的核心概念改造为 Swift 实现,让我们从新的角度去认识 Swift 以及 与 Swift 相关的函数式编程思想,Swift 或 函数式编程爱好者不容错过。

🐎 Unit testing retain cycles

循环引用问题会造成内存泄露,轻则影响应用性能,重则导致应用闪退,非常影响用户体验。同时它也是不太容易被发现的。所以在开发测试过程中,增加对循环引用的检测很有必要。

本文就介绍了如何在单元测试中检查循环引用。思路很简洁,通过建立弱引用去检测。这样我们就能保证代码库本身没有问题,正如文末所说的 “get a level of comfort”。除了检测方式,作者所表现出的这种为代码负责任的态度也是值得我们学习的。

🐕 Self-sizing Table View Cells

这是一个关于 tableview cell 的布局教程,该本教程中,您将学习如何启用自动调整大小的 cell ,以及如何使它们按需调整大小并支持动态类型。该教程通过 storyboard 加代码的教程形式,一步步完成一个大家常见的 tableview 需求,并附上了项目 demo 。

🐕 Extending optionals in Swift

Swift 里的 Optional 虽然帮助我们保证了内存安全访问,但在很多情况下都需要我们解包后再进行操作,让代码显得比较啰嗦而且不连贯。

Sundell 这周就给我们带来了 Optional 的实用拓展,总结了一些 Optional 常见场景,并且构建对应的语法糖去优化 Optional 的使用。

🐕 Swift Async Operations at Your Command

当一个操作相对比较复杂时,使用 Operation 封装上下文会是一种比较合理的做法,这篇文章里作者分别介绍了 Fabric 封装的 FABAsyncOperation 和 FABCompoundOperation 以及各自的使用场景,并且讲述了他在项目中使用 Swift 重写的过程。

🐕 关于 Swift defer 的正确使用

在 Swfit 中,defer 关键字即为延迟的意思,用 defer 声明的 block 并不会立刻执行,而是在当前代码执行退出后被调用,这类似于 JAVA 里的 try/finally。最近,喵神在重构 Kingfisher 的时候,因为 defer 的使用不但而造成了 bug。为此,喵神完整梳理了下 defer 的特性以及使用方法。

代码

30-seconds-of-swift-code

一个立志于让你 30 秒看懂一段 Swift 代码的项目,较为新手向,方便新人快速了解 Swift 的内建函数。当然老鸟也不妨一读,总有你漏掉的知识点。

LINE SDK for iOS Swift

用 Swift 开发的 iOS LINE SDK 可以让我们用现代化的方式来实现 LINE API,包括用户认证及通过 OpenID 获取用户信息等功能,为 iOS app 开发有吸引力的、个性化的用户体验。

内推

关注我们

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

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

本期编辑

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

说明

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

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