2017-04-24 3 views
0

switch-caseブランチにオプションを使用する方法はありますか? 例:一部の機能f(arg:)String?を返します。 f(arg:)が0以外の値を返したときに、何らかのswitch-caseブランチを実行し、この値を使用する必要があります。次の例を参照してください。アドバンストパターンマッチングスウィフト

私はあなたの switch文がこれに等価であると思い
func f(arg: Int) -> String? 

let someValue: Int = ... 

switch someValue { 
    case -3, -2, -1: 
     print("error: negative") 
    case 10, 11, 12: 
     print("error: too big") 
    case let value, let str = f(arg: value): // HOW ???? 
     print("success: non-nil string \(str)") 
    default: 
     print("fail")  
} 

答えて

1

switch someValue { 
    case -3, -2, -1: 
     print("error: negative") 
    case 10, 11, 12: 
     print("error: too big") 
    default: 
     if let str = f(arg: someValue) { 
      print("success: non-nil string \(str)") 
     } else { 
      print("fail") 
     } 
} 

しかし、あなたはsomeValue関数に渡す前に有効であることを知っているので、それがguardステートメントを使用することになり書くためのクリーンな方法:

guard case 0...9 = someValue else { 
    print("someValue is outside of valid range") 
    // Handle error 
    return 
} 

if let str = f(arg: someValue) { 
    print("success: non-nil string \(str)") 
} else { 
    print("fail") 
} 

別の選択肢は、単に場合nilfリターンを作ることです引数が予想される範囲にありません。

func f(arg: Int) -> String? { 
    guard case 0...9 = arg else { 
     print("\(arg) is not in the valid range of 0...9") 
     return nil 
    } 

    // ... 
} 

if let str = f(arg: someValue) { 
    print("success: non-nil string \(str)") 
} else { 
    print("fail") 
} 
+0

は、[値]がdefault'を'よりも優れてみましょう。それで 'if let str = f(arg:value)'を使うことができます。 –

+0

なぜそれが良いのか教えてもらえますか?すべての無効な値をキャッチした後、有効な値だけが 'default'の場合に残されます。 –

+0

はい、' default'も論理的に正しいです。スウィフトのプログラミングでは、次の2つの理由から、スウィフトでの方が優れています。 1.開発者がSwiftの 'switch'で' default'を使用すると、それはもはや有用ではないことを示します。 2.変数のスコープが小さければ小さいほど、他の人がトレースしやすくなります。 私たちは 'case let validValue'を使用することができます。 –

0

古いが、これはあなたが望むものはおそらくです: `ケースを使用して

func f(arg: Int) -> String? 

let someValue: Int = ... 

switch (someValue, f(arg: value)) { 
    case (-3 ... -1, _): 
     print("error: negative") 
    case (10...12, _): 
     print("error: too big") 
    case (_, let str?): 
     print("success: non-nil string \(str)") 
    default: 
     print("fail")  
}