Подтвердить что ты не робот

Строки в операторах 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'

Может кто-нибудь объяснить мне, что я делаю неправильно?

4b9b3361

Ответ 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")
}

(см. добавленный ? к делу)