2017-01-06 3 views
1

時々、guardlet & whereを組み合わせてコードを単純化したいと思うことがあります。しかし、私はletとどこの優先順位が何であるのだろうか。たとえば:あなたは、コンソール結果を見ることができるようにスウィフト:ガードレットと優先度

class Person { 
    func check() -> Bool? { 
     print("checking") 
     return nil 
    } 
} 

func test(dont: Bool) { 
    let person = Person() 
    guard let check = person.check() where dont else { 
     print("should not check") 
     return 
    } 
    print("result: \(check)") 
} 


test(false) 

、印刷出力は次のとおりです。

  • guard <condition> else { }構文でlet check = person.check() where dontの条件について

を確認するべきではありませんチェックし、 whereの式であっても、letの式の結果には関係なく、Swiftは最初に、次にwhereをチェックします。場合によっては私のコードでletオプションのバインディングは多くの計算を必要とし、wherewhereguardの外に移動するとletの結果に依存せずに単純な条件に過ぎません。または私は優先順位について間違っているか、&どこに?

答えて

2

あなたは正しいですが、あなたのスウィフトに2コード

guard let check = person.check() where dont else { } 

条件付き結合let check = ...が最初にチェックされ、それが成功した場合のみ、ブール条件dontがチェックされます。ブール条件を最初にチェックするには、

guard dont, let check = person.check() else { } 

を使用できます。

構文でこの「非対称性は、」スウィフト3で削除されました: すべてのガード条項は、カンマで区切られており、 whereキーワードはもう使用されていません。だから、あなたが短絡して、左から右へ

guard let check = person.check(), dont else { } 
// or 
guard dont, let check = person.check() else { } 

条件がチェックされてい、 は一つの条件は、失敗した場合、すなわち、他のブロックが残っている状態を確認 せずに実行されます。