web-dev-qa-db-fra.com

Chaînes dans les instructions de commutation: 'String' n'est pas conforme au protocole 'IntervalType'

J'ai des problèmes avec l'utilisation de chaînes dans les instructions switch dans Swift.

J'ai un dictionnaire appelé opts qui est déclaré comme <String, AnyObject>

J'ai ce code:

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

et sur les lignes case "abc" et case "def" J'obtiens l'erreur suivante:

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

Quelqu'un peut-il m'expliquer ce que je fais mal?

38
Jimmery

Cette erreur s'affiche lorsqu'une option est utilisée dans une instruction switch. Déballez simplement la variable et tout devrait fonctionner.

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

Edit: Dans le cas où vous ne voulez pas faire un déballage forcé de l'option, vous pouvez utiliser guard. Référence: Flux de contrôle: sortie anticipée

61
Ayush Goel

Selon Swift Language Reference :

Le type Facultatif est une énumération avec deux cas, None et Some (T), qui sont utilisés pour représenter des valeurs qui peuvent ou non être présentes.

Donc, sous le capot, un type facultatif ressemble à ceci:

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

Cela signifie que vous pouvez aller sans déballage forcé:

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")
}

Cela peut être plus sûr, car l'application ne se bloquera pas si type n'a pas été trouvé dans le dictionnaire opts.

37
mikejd

Essayez d'utiliser:

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

J'ai eu ce même message d'erreur à l'intérieur de prepareForSegue(), qui, j'imagine, est assez courant. Le message d'erreur est quelque peu opaque mais les réponses ici m'ont mis sur la bonne voie. Si quelqu'un rencontre cela, vous n'avez pas besoin de transtypage, juste un déroulement conditionnel autour de l'instruction switch: -

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

Au lieu du déballage forcé dangereux, je trouve plus facile de tester le cas optionnel:

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

(Voir ajouté ? au boîtier)

5
Andres Canella