web-dev-qa-db-ja.com

Switchステートメントの文字列: 'String'はプロトコル 'IntervalType'に準拠していません

Swiftのswitchステートメントで文字列を使用すると問題が発生します。

<String, AnyObject>として宣言されているoptsという辞書があります

私はこのコードを持っています:

switch opts["type"] {
case "abc":
    println("Type is abc")
case "def":
    println("Type is def")
default:
    println("Type is something else")
}

case "abc"およびcase "def"に次のエラーが表示されます。

Type 'String' does not conform to protocol 'IntervalType'

誰かが私に間違っていることを説明できますか?

38
Jimmery

このエラーは、switchステートメントでオプションが使用されている場合に表示されます。変数をアンラップするだけで、すべてが機能するはずです。

switch opts["type"]! {
  case "abc":
    println("Type is abc")
  case "def":
    println("Type is def")
  default:
    println("Type is something else")
}

編集:オプションの強制的なアンラッピングを行いたくない場合は、guardを使用できます。参照: 制御フロー:早期終了

61
Ayush Goel

Swift Language Reference によると:

タイプOptionalは、NoneとSome(T)の2つのケースを持つ列挙であり、存在する場合と存在しない場合がある値を表すために使用されます。

そのため、内部ではオプションのタイプは次のようになります。

enum Optional<T> {
  case None
  case Some(T)
}

これは、without強制的にアンラップできることを意味します。

switch opts["type"] {
case .Some("A"):
  println("Type is A")
case .Some("B"):
  println("Type is B")
case .None:
  println("Type not found")
default:
  println("Type is something else")
}

これは、typeopts辞書で見つからなかった場合にアプリがクラッシュしないため、より安全です。

37
mikejd

使用してみてください:

let str:String = opts["type"] as String
switch str {
case "abc":
    println("Type is abc")
case "def":
    println("Type is def")
default:
    println("Type is something else")
}
17
Kirsteins

prepareForSegue()の中に同じエラーメッセージがありましたが、これはかなり一般的だと思います。エラーメッセージはやや不透明ですが、ここでの答えは私を正しい方向に導きました。誰かがこれに遭遇した場合、タイプキャストは不要で、switchステートメントを条件付きでラップ解除するだけです。

if let segueID = segue.identifier {
    switch segueID {
        case "MySegueIdentifier":
            // prepare for this segue
        default:
            break
    }
}
13
Echelon

安全でない力の展開の代わりに..オプションのケースをテストする方が簡単だと思います:

switch opts["type"] {
  case "abc"?:
    println("Type is abc")
  case "def"?:
    println("Type is def")
  default:
    println("Type is something else")
}

(ケースに追加されたを参照)

5
Andres Canella