测试 Swift 选项的惯用方法

Idiomatic way to test Swift Optionals

我不是在问这些扩展是否是个好主意,这只是一个思想实验,我正在尝试从实践中学习。

同意 Christian Lattner 的观点,方法通常更可取,我想我会尝试表达:

someVariable.isNil

someVariable.notNil

在实现它时,我发现自己很好奇以下实现中的一个或另一个是否比另一个更可取,原因是什么?一个人会比其他人更有效率吗?是否存在一种更好或另一种更好的边缘情况。

解决方案 1:

extension Optional {
    var isNil:Bool {
        switch self {
        case .None:
            return true
        case .Some:
            return false
        }
    }

    var notNil:Bool {
        switch self {
        case .None:
            return false
        case .Some:
            return true
        }
    }
}

解决方案 2:

extension Optional {
    var isNil:Bool {
        return self == nil
    }

    var notNil:Bool {
        return self != nil
    }
}

我不确定这些方法有多大用处,但它们是讨论的一个很好的起点。

看看Optional的当前实现:

https://github.com/apple/swift/blob/ecd3c07a86394aa6b1372f1370f470842b39ea6e/stdlib/public/core/Optional.swift

靠近顶部,您可以看到它自己最原始的表示使用.None 和.Some。所以解决方案 1 是最直接的方法,开销最少,并且遵循 Optional 本身的实现中使用的模式。我会说这算作惯用语。

使用 operator == 只会增加不必要的间接访问,甚至无法按照您提供的方式工作。