kemchenj

Hackable life?

今年 WWDC 上提了一下 Swift 废除 IUO 类型的事情,给了我一个机会去更加深入了解 IUO 相关的内容,实际上 IUO 的行为在 Swift 3 里就增强限制了,为了这一次的修改作了铺垫,这次在 Swift 4.2 里终于彻底去掉了 IUO 类型。

我在写这篇 What’s New in Swift 的时候找了很多资料,但找不到一篇文章把这件事情说的很清楚,一方面是社区对于这件事情的关心也不是很大,另一方面是这个修改在 Swift 3 里已经做了铺垫,对于现有代码的破坏性很小。而且官方提案里也是写得很含糊,写得最好的是,虽然前面那篇 WWDC 的专题文章已经讲过了大概的概念,但我后来看了别人的一些文章,自己也思考了一段时间之后,觉得还是可以单独拎出来写篇文章,用更简单易懂的方式来讲清楚这个修改。

阅读全文 »

这篇文章发表出来的三年之后,开源版的 Foundation 使用同样的思路重写了 JSONDecoder 的 Parser 部分,感兴趣的朋友可以点击进去查看,比起本文实现的版本更加可靠,测试也更加完备。

如果只是想要了解 JSONDecoder 和 Parser,这篇文章还是可以帮到你。

Codable 出来很久了,不过好像还没有比较详细讲过如何自定义 Decoder 的文章,在这里就打算写一篇来介绍。

本文将带着大家深入了解一下 Decoder 的抽象,但单纯讲抽象看代码会有点太无聊,所以文章会有两部分,第一部分讲 Decoder 的抽象,第二部分,我们使用比较简单的抽象来自定义一个 JSONDecoder,并且针对原生的不足,做一些针对性的优化,让我们自定义的这个 Decoder 拥有更强的性能和拓展性。

阅读全文 »

用了 SnapKit 很久,一开始觉得这就是个很简单的语法糖,后面用着用着还是觉得有点磕磕绊绊,所以又回去看过了一遍官方文档,发现了几个 best practice 是我之前一直没留意到的,就写出来分享一下。

阅读全文 »

原文:Generics Manifesto – Douglas Gregor

译者注

在我慢慢地深入使用 Swift 之后,碰壁了很多次,很大一部分都是因为 Swift 的泛型系统导致的,很多抽象都没办法很好地表达出来,所以就翻译了这篇文章来学习一下 Swift 的泛型。

文章里特别提到了要用官方提到的用语来讨论,所以那些 feature 的名称我都会保留英文。

简介

“完善的泛型系统” 这个 Swift 3 的目标到目前为止都不是那么的明确:

完善的泛型系统: 泛型功能已经在大量的 Swift 库中使用,特别是标准库。然而,标准库所需的的一大堆泛型功能,都需要泛型系统完整的实现,包括了 Recursive Protocol Constraints 协议递归约束,Condition Comformance 让受约束的拓展遵循一个新协议的能力(例如,一个元素 Equatable 的数组也应该是 Equatable 的),诸如此类。Swift 3.0 应该提供这些标准库需要的泛型功能,因为它们会影响到标准库的 ABI。

阅读全文 »

最近刚换工作,在迁移 Swift 4.0,其实我感觉 Swift 3.0 的时候迁移工作更容易一点,因为所有库都很积极地升级版本,而现在反而都在做 Swift 3.2 的兼容方案,每个库的兼容状况不同让迁移工作变得更难。

但今天想说的是另一个问题,Codable 的迁移,我们项目里是用了 Moya + ObjectMapper 的方案,使用 Swift 的话,大家使用的 JSON 解析方案应该都一样,都是定义协议,模型遵守协议提供 JSON 解析的方法。

如果 JSON 格式标准,而且命名方式一致的话,把 Mappable 全局替换成 Codable 就完成了 99% 的迁移工作了。但现实并不总是那么理想,那就只能保留 Mappable,然后新的 Model 使用 Codable 来处理了,后面有空再来逐步替换。

阅读全文 »

完整的实现:Gist

最近刚好接触了字符串的切片,原生的 API 各种麻烦,我就试着实现了几个语法糖,目标是:

let str = "Swift-Evolution"
str[3...] // "ft-Evolution"
str[...3] // "Swif"
str[..<3] // "Swi"
str[3...11] // "ft-Evolut"
阅读全文 »

Swift 4.0 带来的一个新功能就是 Smart KeyPath,之前在 Twitter 上看到 Chris Eidhof 大神在征集 KeyPath 的用法。

我也搜集了一下,当作是一次总结,这里面的技巧其实大部分都很难在实践中用上,只是好玩有趣而已,也算是一种启发吧。

阅读全文 »

本来这篇文章的标题是“如何写一个不安全的构造器”,但后面查资料的时候又发现了一些很好玩的东西,就一次性写成一篇出来,跟大家分享一下 Swift 里的几个 best pratice:

  • 带关联值的 Enum 的构造器
  • strongSelf 的另一种写法
  • 如何在 Swift 里写一个不安全的构造器
  • mutating 函数的定义
阅读全文 »

问题的起源

今天在 qq 上看到有人发了一段代码,在 iOS 8 里按 button 会闪退,在 iOS 9 以上的版本就可以正常运行。

class ViewController: UIViewController {

dynamic func click() { ... }

let button: UIButton = {
let button = UIButton()

button.addTarget(self,
action: #selector(click),
for: .touchUpInside)

return button
}()

override func viewDidLoad() {
super.viewDidLoad()

view.addSubview(button)
}

... other code ...
}
阅读全文 »