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'
誰かが私に間違っていることを説明できますか?
このエラーは、switchステートメントでオプションが使用されている場合に表示されます。変数をアンラップするだけで、すべてが機能するはずです。
switch opts["type"]! {
case "abc":
println("Type is abc")
case "def":
println("Type is def")
default:
println("Type is something else")
}
編集:オプションの強制的なアンラッピングを行いたくない場合は、guard
を使用できます。参照: 制御フロー:早期終了
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")
}
これは、type
がopts
辞書で見つからなかった場合にアプリがクラッシュしないため、より安全です。
使用してみてください:
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")
}
prepareForSegue()
の中に同じエラーメッセージがありましたが、これはかなり一般的だと思います。エラーメッセージはやや不透明ですが、ここでの答えは私を正しい方向に導きました。誰かがこれに遭遇した場合、タイプキャストは不要で、switchステートメントを条件付きでラップ解除するだけです。
if let segueID = segue.identifier {
switch segueID {
case "MySegueIdentifier":
// prepare for this segue
default:
break
}
}
安全でない力の展開の代わりに..オプションのケースをテストする方が簡単だと思います:
switch opts["type"] {
case "abc"?:
println("Type is abc")
case "def"?:
println("Type is def")
default:
println("Type is something else")
}
(ケースに追加された?を参照)