测试Swift Optionals的惯用方法

时间:2015-12-18 16:53:53

标签: swift optional swift-extensions

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

与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
    }
}

1 个答案:

答案 0 :(得分:0)

我不确定这些方法有多么有用,但它们是讨论的良好起点。

看一下Optional的当前实现:

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

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

使用operator ==只会增加不必要的间接,甚至不会像你提出的那样工作。