2017-01-09 5 views
0

変数は2つありますが、1つのみがオプションです。のは、パターンマッチングながらbのラップを解除する方法Swiftでオプションのwhileパターンマッチングをアンラッピングする方法は?

lazy var a: UIAlertView = { 

    return UIAlertView() // Which is not important here 
}() 

var b: UIAlertView? 

とデリゲートメソッド

func alertView(alertView: SPAlertView!, clickedButtonAtIndex buttonIndex: Int) { 

    switch (alertView, buttonIndex) { 

    case (a, 0): // Do something 
    case (a, 1): // Do something 
    case (b, 1): // <== Want to do something here but, b is optional. 
    default: break 
    } 
} 

をしましょうか?

注意:質問はSwift languageについてではなく、UIAlertViewについてです。

助けが必要ですか?

+0

可能な重複:// stackoverflow.com/questions/26941529/swift-testing-against-optional-value-in-switch-case –

+0

@MartinRいいえ、私の質問はあなたが言及した質問の正反対です。 – Goppinath

+0

私はそうは思わない。その*質問*は、オプションでない 'someValue'とオプションの' someOptional'を照合する方法です。これはあなたが求めているものです。受け入れられた答えの最初の提案は、それ以外の方法で行いますが、2番目の提案 'case let val where val == someOptional:'はあなたのケースでもうまくいきます(Callamの提案と同様です)。 –

答えて

1

alertViewがbに等しいかどうかを確認するためにwhere句を使用できます。

case (_, 1) where alertView == b: 

だけ.someとアンダースコアを置き換え、nilでないで開封されたalertViewを確保するため。

case (.Some, 1) where alertView == b: 

同様に、アンラップされたalertViewを許可することもできますが、これは基本的には上記と同じです。

case (let .Some(_alertView), 1) where _alertView == b: 
+0

それは動作しますが、それは私を満足させていません。私はしばらく待って、それを正しい答えにしてくれます。それまでの投票。ありがとう。 – Goppinath

+0

@Goppinathはupvoteに感謝します。正確にあなたを悩ましているのは何ですか? – Callam

+1

もう一度ありがとう! – Goppinath

0

あなたは(場合?を使用して)これを試してみてください あなたがスイッチオンされているタプルにself.bを追加する必要があります:HTTPの

func alertView(alertView: SPAlertView!, clickedButtonAtIndex buttonIndex: Int) { 
    switch (b, alertView, buttonIndex) { 
    case (_, a, 0), (_,a,1): // Do something 
    case (b?, a, 1): // <== b is not optional here (only matches case .Some = b and binds to local variable `b` 
    default: break 
    } 
} 
+0

私もそれを試みたが、うまくいかなかった。私はまだSwift 2.2を使っているからかもしれない? – Goppinath

+0

更新されました。コンパイルできない場合はお知らせください –

関連する問題