2017-07-02 8 views
0

ifステートメントにいくつかのオプションのバインディングをカンマで区切って含めることができ、ANDのような振る舞いをすることができることは、Swift 3.1のドキュメントに記載されています。オプションのバインディングのOR条件?

2つのオプションのプロパティがあり、どちらか(または両方)がnilであるかどうかをチェックし、非nilをアンラップしてからコードブロックを実行したいとします。この使い方:

if let = property1, let = property2 { 
    // Some task to do with unwrapped property 
} 

は、両方の性質がアンラップされた場合if文ブロック(AND条件)を実行します。しかし、私にとっては、ifステートメントブロック(ORの条件)のコードを実行するためには、少なくとも1つのプロパティがNil以外であることが必要です。しかし、私がこれを好きなら:

if property1 != nil || property2 != nil { 
    // Some task to do with non-nil property 
} 

しかし、私は非nilプロパティのラップされていない値を持っていません。私はアンラップされた値をifステートメントブロックで利用可能にして、オプションの連鎖を避けるようにしたいと思います。

これを達成するためのベストプラクティスと最もコンパクトな方法はどちらですか?

答えて

1

残念ながら、これは1行で可能ではないと思います(if let x = y || let z = a {}など)。論理的には意味をなさないでしょう。なぜなら、両方の変数がオプションのままになる状態になるからです(どちらがアンラップされていてもアンラップされていないか、どちらがアンラップされているか分かりません)。私はあなたがこの問題にいくつかの他のアプローチを取る必要があると思う。私は、最も簡単な形式は

if let unwrappedProperty1 = property1 { 
    handleProperty(unwrappedProperty1) 
} else if let unwrappedProperty2 = property2 { 
    handleProperty(unwrappedProperty2) 
} 

か、

をプロパティ1に優先権を与えるだろう

if let unwrappedProperty = property1 ?? property2 { 
    handleProperty(unwrappedProperty) 
} 

のような何かができるようなものになるだろうと思います

1

これはいかがですか。

if let property = property1 ?? property2 { 
    // non nil property (any one of the two) 
} 

property1property2の両方が優先取得property1値を持っている場合。

関連する問題