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 に答える