web-dev-qa-db-fra.com

Swift: Test du type de classe dans l'instruction switch

Dans Swift, vous pouvez vérifier le type de classe d'un objet à l'aide de 'is'. Comment puis-je incorporer cela dans un bloc 'switch'?

Je pense que ce n'est pas possible, alors je me demande quel est le meilleur moyen de contourner ce problème.

174
kingrolo

Vous pouvez absolument utiliser is dans un bloc switch. Voir "Transtypage de types pour Any et AnyObject" dans le langage de programmation Swift (bien que cela ne se limite pas à Any bien sûr). Ils ont un exemple complet:

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")
    }
}
375
Rob Napier

Mise en place de l'exemple pour "cas est - cas est Int, est String: " opération, où plusieurs cas peuvent être combinés pour effectuer la même activité pour les types d'objets similaires. Ici "," séparant les types au cas où cela fonctionne comme un OU opérateur.

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

lien démo

41
Abhijeet

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

Swift 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
22
Prcela

J'aime cette syntaxe:

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

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

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