2016-12-07 3 views
3

switch文のこのエラーの原因は何ですか?すべてのパターンエラーでスウィフト "h"がバインドされている必要があります - スイッチの問題

私は基本的にhを1時間の変数として使用しようとしていますが、これはnilではないことを確認しています(時間はオプションの値で、17より大きいかどうかを確認するためです)。私はどこかでこれが間違っていることを知っていますが、その厄介な小さな「hはあらゆるパターンに縛られなければならない」というエラーですか?

おかげ

 let date = NSDate() 
     let calendar = Calendar.current 
     let components = calendar.dateComponents([.hour], from: date as Date) 
     let hour = components.hour 


     switch hour { 
     case let h, (h as Int) != nil, h >= 17: 
      return true 
     default: 
      return false 

     } 
+2

これは、パターンマッチングを使用しているように見えるしませんので、あなたの代わりにif文でそれをスローすることをお勧めします。 – zneak

+0

私は最後にif文にスローしましたが、なぜそれを示唆していますか?私のここでの試みは、letとオプションのバインディングを作成して、 'h'がオプション(時間)のアンラップされた値になるようにしたものです。 – user7024499

答えて

5

あなたはこのような何か書く必要がある場合があります。

if let h = hour, h >= 17 { 
    return true 
} else { 
    return false 
} 

さもないと、単に:

if文を使用して、提案されているよう

switch hour { 
case let h? where h >= 17: 
    return true 
default: 
    return false 

} 

かを、

return hour != nil && hour! >= 17 

エラーメッセージは、多くの場合、このパターンで発見された:

enum MyEnum { 
    case patternA(Int) 
    case patternB(Int) 
    case patternC 
} 

let me = MyEnum.patternB(30) 

switch me { 
case .patternA(let h), .patternB(let h), .patternC: //<- 
    print("A or B with h, or C") 
default: 
    print("this may never happen") 
} 
+0

最初の例は、case let h?を使用しています...それは私が探しているものです! !どのようにこれは動作しますか?なぜあなたは疑問符でhをオプションとして宣言していますか?どのようにhの後に疑問符を削除すると、コンパイラは 'where'節でhをアンラップするようにしたいのですか?ありがとう – user7024499

+1

@ user7024499、 'let h?'のようなパターンは '.some(let h)'の短縮形です。 Swiftでは、オプションの値は '.some(someValue)'や '.none'のようなenumの値なので、' .some(let h) 'は非オプションの値と一致します。 – OOPer

+0

ありがとう!あなたは、Hを聞かせてくださいという意味ですか? .some(h)の短縮形ですか? 'let H'とは対照的に私は間違っているかもしれませんが、それはちょうど私にとってより意味があります。これはオプションの列挙型が 'h'の値を保持していることを示しています。これは '時間'のラップされていない値の実際の値と同じに設定されています。この場合、where句はhを実際の値ラップされた値ではありません。 – user7024499

関連する問題