Строки в операторах switch: "String" не соответствует протоколу "IntervalType"
У меня возникают проблемы с использованием строк в операторах switch в Swift.
У меня есть словарь под названием opts
, который объявлен как <String, AnyObject>
У меня есть этот код:
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'
Может кто-нибудь объяснить мне, что я делаю неправильно?
Ответы
Ответ 1
Эта ошибка отображается, когда в инструкции switch используется опция.
Просто разворачивайте переменную, и все должно работать.
switch opts["type"]! {
case "abc":
println("Type is abc")
case "def":
println("Type is def")
default:
println("Type is something else")
}
Изменить:
Если вы не хотите принудительно отключать опцию, вы можете использовать guard
. Ссылка: Контроль потока: ранний выход
Ответ 2
В соответствии с Свифт Language Reference:
Тип Необязательный - это перечисление с двумя случаями: None и Some (T), которые используются для представления значений, которые могут быть или не быть.
Итак, под капотом необязательный тип выглядит следующим образом:
enum Optional<T> {
case None
case Some(T)
}
Это означает, что вы можете пойти без принудительной разворачивания:
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
.
Ответ 3
Попробуйте использовать:
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")
}
Ответ 4
У меня было такое же сообщение об ошибке внутри prepareForSegue()
, которое я считаю довольно распространенным явлением. Сообщение об ошибке несколько непрозрачно, но ответы здесь дали мне правильный путь. Если кто-либо сталкивается с этим, вам не нужно никакого приведения типов, просто условное разворачивание вокруг оператора switch: -
if let segueID = segue.identifier {
switch segueID {
case "MySegueIdentifier":
// prepare for this segue
default:
break
}
}
Ответ 5
Вместо небезопасного разворота силы. Мне легче протестировать факультативный случай:
switch opts["type"] {
case "abc"?:
println("Type is abc")
case "def"?:
println("Type is def")
default:
println("Type is something else")
}
(см. добавленный ? к делу)