ddddxxx's Blog

Hello, world!

封装 NSRegularExpression

本文是关于 Regex 库的设计心得。 在 Swift 中使用 NSRegularExpression 非常繁琐。实际使用中,我们通常都会对其进行扩展(例如去除匹配时必须传入的 NSRange 参数),或是另起炉灶,重新设计一套 API。 出于个人使用需求,我早在 Swift 3 时期就制作了一个 Regex 库。当时我找遍了 GitHub 上类似的项目,无一能满足我的要求,只好...

Swift 中 String 和 Index 的奇妙行为

在 Playground 中运行这段代码,猜猜最后一行的结果是什么: var s = String(format: "你好 %@", "world!") let i = s.firstIndex(of: "w")! s.reserveCapacity(100) s[i] 答案是 Xcode (10.2.1, 10E1001) 会崩溃。如果把最后一行换成 print(s[i]),你会得到...

Method Swizzling 与 NSProxy

本文假设读者有关于 Method Swizzling,和 objc 消息处理流程的基本知识。 Hook delegate 方法 使用 Method Swizzling 可以轻松 hook 一个类中的已知方法,但是对于 delegate 方法,其实际调用的类是不确定的, 如何针对未知调用类来 hook 呢? 这是一个很经典的问题,网上已经有很成熟的方案了。这里只大概讲一下思路。 ...

Swift 中基于闭包的 KVO 的隐患

KVO (Key-Value Observing) 是 Foundation 提供的极其强大的特性,但是使用起来十分啰嗦。好在 Swift 4 提供了一个简洁的包装。我们可以轻松写出以下的代码: class A: NSObject { @objc dynamic var v: Int = 0 } class B: NSObject { let a = A() v...

在 Swift 中捕获 Objc 抛出的异常

错误还是异常 一般来说错误分为两种情况。一种是可以预见,可恢复的错误。称为错误(error)。另一种则是不能预见,通常也是不可恢复的致命错误。称为异常(exception)。例如,文件无法打开是错误,数组访问越界则是异常。 在 Objective-C 中,这两种错误分别以 NSError 和 NSException 表示。Apple 有两篇关于此的文档,Dealing with Erro...

【译】Swift 4 中的弱引用

Swift 4 Weak References

本文译自 Friday Q&A 2017-09-22: Swift 4 Weak References,作者 Mike Ash。 译者 ddddxxx,自由转载,请注明出处。 Swift 刚开源不久,我写了一篇关于弱引用如何实现的文章。时过境迁,这一实现已经发生了改变。我将谈谈当前的实现方法,以及和旧版本的对比。 原有的实现 鉴于有些人已经忘了原有的实现,...

macOS 10.13 SDK 的一个错误,以及解决方案

最近升级了 Xcode 9 GM,并把几个主要项目迁移到了 Swift 4。过程中发现了一个小坑,记下来以供参考。 0 Xcode 9 附带的 macOS 10.13 SDK 中有这样一个改动: - func validModesForFontPanel(_ fontPanel: NSFontPanel) -> Int + func validModesForFontPanel(...

如何优雅地在 Jekyll 博客中插入高清图片

用 Markdown 插入图片是一件很简单的事,只需要这样写: ![AltText](/path/to/img.jpg) 然而,如果你需要进行更多的控制,情况立刻变得复杂了起来。由于 Markdown 秉持结构和样式分离的原则,你无法在插入图片时控制其大小。要达到这样的目的,你需要使用普通的 <img> 标签: <img src="/path/to/img.jpg"...

制作跨  平台的动态链接库

注意:这篇文章旨在解决多平台项目中 target 过多的问题,而不会教你制作 Framework 的基础知识。 引言 如果你制作过跨  平台的 framework,你一定遇到过这种情况: Alamofire 支持 iOS/macOS/tvOS/watchOS,加上测试,总共有 7 个 target。 再看 SnapKit 的: 同样是支持多平台,然而只有两个 Ta...