Swift 小技巧:通过 `±` 创建一个“正负误差范围”

这是我的第一篇小专栏文章,我是 lovee,因为身处日本的缘故平时我一般都会在 Qiita 上发布文章;而因为很长一段时间没有发现国内有类似的服务的缘故,我一直没有将自己的文章用中文发布出来。今天因为偶然在微博上发现了喵神大大的文章,所以我也决定来凑个热闹;今后我会主要不定期发布以 Swift / iOS 开发为中心的文章,包括一些以前已经在 Qiita 上发布过的文章的中文版,时不时可能也会发布一些相对不是那么纯技术向的吐槽,希望大家能喜欢;只是因为我并没有在国内系统地学习过任何一门编程语言(唯一的经验是初中的时候自学过一点 Visual Basic 6.0 ...是的你没看错 6.0),因此很多专业术语的中文名称我并不清楚,这种时候我会倾向于使用英文原文来表达,希望大家能谅解

好了废话不多说,首先第一篇文章先转一个自己以前在 Qiita 上发布过的文章,标题同本文章标题。

虽然我不太清楚这对于多少人有用,不过物理学等领域经常能看到类似“AA ± aa”这样的表述。简单来说就是“精确来说是 AA,但是现实环境中基本不可能实现这么精确的条件,所以允许有正负 aa 的误差”的意思。比如说我们需要 1kg 的水,但是由于测量仪器的精确度不太可能让我们得到正好 1kg 分毫不差的量,所以允许有个正负 10g 的误差的时候,我们就会用 1kg ± 10g 来表达 990g ~ 1010g 的范围。

在 Swift 里面我们有范围运算符 ...,因此只需要写 990 ... 1010 就能表达出上述的范围;但是这样的写法很难让我们一眼就看出来“我们需要的是 1kg,正负的 10g 只是误差范围”这个条件。因此在这里我们更希望能使用 1000 ± 10 来表达出这个意思。Swift 支持自定义运算符,所以这个想法并不难实现,接下来就让我们通过下面的代码来实现这个需求:

```swift:Operator.swift
infix operator ± : RangeFormationPrecedence

extension Numeric where Self: Comparable {

public static func ± (lhs: Self, rhs: Self) -> ClosedRange<Self> {
    let added = lhs + rhs
    let subtracted = lhs - rhs
    let lowerBound = min(added, subtracted)
top Created with Sketch.