专栏名称: SwiftGG翻译组
iOS 开发
目录
相关文章推荐
51好读  ›  专栏  ›  SwiftGG翻译组

每一点进步都是快乐:无处不在的扩展

SwiftGG翻译组  · 掘金  · ios  · 2019-11-06 02:23

正文

阅读 18

每一点进步都是快乐:无处不在的扩展

作者:Russ Bishop, 原文链接 ,原文日期:2018-11-08 译者:俊东;校对: numbbbbb WAMaker ;定稿: Pancf

这篇文章记录了我所收获的小惊喜。在 Swift 中写扩展让人感觉非常自然。

我认为 UnsafeMutableRawBufferPointer.baseAddress 是可选项这回事非常不合理。在实践中它会使代码变得丑陋。我也不喜欢在分配时指定对齐方式;在大多数平台上,合理的默认值都是 Int.bitWidth / 8

通过扩展,我们可以很容易地解决这些问题。这样的解决方案能像标准库一样自然地使用。

首先,我们需要在调试版本中进行简单的健全性检查,以确保不会产生无意义的对齐计算。这里提一个有关正整数的小技巧:一个 2 的 n 次幂数只有一个比特位是有值的。减去 1 时就是把后面的所有比特位设置为 1,如 8( 0b1000 )- 1 得到 7( 0b0111 )。这两个数字没有共同的位,因此按位取与应该产生零。由于这规律在零上无效,所以需要单独检查。

extension BinaryInteger {
    var isPositivePowerOf2: Bool {
        @inline(__always)
        get {
            return (self & (self - 1)) == 0 && self != 0
        }
    }
}
复制代码

让 allocate 方法默认使用自然整数宽度对齐。设置对齐参数可能有点多余,不过它几乎能处理我们想要存储在缓冲区中的任何数据。虽然断言仅在调试环境中有效,但这已经够应付我们的使用;已知 Swift 支持的平台上这个断言都会是 true。







请到「今天看啥」查看全文