2

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

同意克里斯蒂安·拉特纳(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
    }
}
4

1 回答 1

0

我不确定这些方法有多有用,但它们为讨论提供了一个很好的起点。

看一下 Optional 的当前实现:

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

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

使用operator ==只会增加不必要的间接性,甚至不会按照您呈现它的方式工作。

于 2015-12-18T17:06:20.360 回答