Swift: type de classe de test dans l'instruction switch

208

Dans Swift, vous pouvez vérifier le type de classe d'un objet en utilisant «is». Comment puis-je l'incorporer dans un bloc «commutateur»?

Je pense que ce n'est pas possible, alors je me demande quelle est la meilleure façon de contourner cela.

kingrolo
la source

Réponses:

438

Vous pouvez absolument utiliser isdans un switchbloc. Voir «Casting de type pour Any et AnyObject» dans le langage de programmation Swift (bien que cela ne soit pas limité Anybien sûr). Ils ont un exemple détaillé:

for thing in things {
    switch thing {
    case 0 as Int:
        println("zero as an Int")
    case 0 as Double:
        println("zero as a Double")
    case let someInt as Int:
        println("an integer value of \(someInt)")
    case let someDouble as Double where someDouble > 0:
        println("a positive double value of \(someDouble)")
// here it comes:
    case is Double:
        println("some other double value that I don't want to print")
    case let someString as String:
        println("a string value of \"\(someString)\"")
    case let (x, y) as (Double, Double):
        println("an (x, y) point at \(x), \(y)")
    case let movie as Movie:
        println("a movie called '\(movie.name)', dir. \(movie.director)")
    default:
        println("something else")
    }
}
Rob Napier
la source
2
Salut, Rob. Juste la curiosité: puisque nous n'utilisons pas thingdans switch` dans aucun des cases ci-dessus, quelle serait l'utilité ici thing? Je ne l'ai pas vu. Merci.
Unheilig
3
chose est la valeur testée dans chaque cas. Donc, si la chose est un film, sa valeur sera liée au film symbole.
Rob Napier
5
"Vous pouvez absolument utiliser is" - et puis il ne l'utilise jamais. X)
Raphael
3
@Raphael je peux voir case is Doubledans la réponse
Gobe
2
@Gobe Mon mauvais, ça m'a manqué. :> Mon excuse: ce n'est peut-être pas l'exemple le plus illustratif?
Raphael
46

Mettre en place l'exemple de "case is - case is Int, is String: " operation, où plusieurs cas peuvent être utilisés ensemble pour effectuer la même activité pour les types d'objets similaires. Ici "," séparant les types au cas où fonctionne comme un opérateur OR .

switch value{
case is Int, is String:
    if value is Int{
        print("Integer::\(value)")
    }else{
        print("String::\(value)")
    }
default:
    print("\(value)")
}

Lien de démonstration

Abhijeet
la source
11
assembler deux cas juste pour les séparer via ifn'est probablement pas le meilleur exemple pour prouver votre point.
prudence
1
Il serait probablement mieux si valueest quelque chose qui peut être l' un Int, Float, Doubleet le traitement Floatet de Doublela même manière.
noamtm
30

Si vous n'avez pas de valeur, n'importe quel objet:

rapide 4

func test(_ val:Any) {
    switch val {
    case is NSString:
        print("it is NSString")
    case is String:
        print("it is a String")
    case is Int:
        print("it is int")
    default:
        print(val)
    }
}


let str: NSString = "some nsstring value"
let i:Int=1
test(str) 
// it is NSString
test(i) 
// it is int
Prcela
la source
17

J'aime cette syntaxe:

switch thing {
case _ as Int: print("thing is Int")
case _ as Double: print("thing is Double")
}

car il vous donne la possibilité d'étendre rapidement la fonctionnalité, comme ceci:

switch thing {
case let myInt as Int: print("\(myInt) is Int")
case _ as Double: print("thing is Double")
}
Daniel
la source