2016-05-05 3 views
2

ドキュメントだけでは、オプションの連鎖評価の順序について明示的には何も言及していないよう:スウィフトのオプションチェーンは、左から右にゆっくりと評価されますか?

複数のクエリを一緒に連鎖させることができ、かつチェーン内のすべてのリンクがnilであれば、チェーン全体が優雅に失敗します。

明白に思えるかもしれませんが、何が起こるかを正確に確認する必要があり、それが他人に役立つかもしれないと考えました。例えば私たちは安全にこの種のことをすることができますか?

opVar?.someObject.someMethod(opVar!) 

答えて

2

オプションのチェーンは、左から右にゆっくりと評価されます。チェーンの最初のオプションでは、チェーンの評価が停止します。

// Playground test for left-to-right lazy evaluation. 
struct C { 
    static var i = 0 
    func chain(count: Int) -> C? { 
     print("Expected \(count) -> \(C.i)") 
     assert(count == C.i) 
     C.i += 1 
     return C.i > 2 ? nil : self 
    } 
} 

let c = C() 
c.chain(0)?.chain(1)?.chain(2)?.chain(3)!.chain(4)! 

出力

Expected 0 -> 0 
Expected 1 -> 1 
Expected 2 -> 2 
+0

は他の操作は右から左に評価され、それが連鎖するオプションに来るときにのみそれが左から右に評価のか? – Honey

+0

一般的に物事は左から右(優先ルールに従う)で評価されますが、問題は*遅延評価されているかどうかです。 https://en.wikipedia.org/wiki/Lazy_evaluation –

関連する問題