Swift: tipo de clase de prueba en la instrucción switch

208

En Swift puede verificar el tipo de clase de un objeto usando 'is'. ¿Cómo puedo incorporar esto en un bloque 'interruptor'?

Creo que no es posible, así que me pregunto cuál es la mejor manera de evitar esto.

kingrolo
fuente

Respuestas:

438

Absolutamente puede usar isen un switchbloque. Consulte "Tipo de conversión para Any y AnyObject" en el lenguaje de programación Swift (aunque no se limita a, Anypor supuesto). Tienen un extenso ejemplo:

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
fuente
2
Hola rob Solo curiosidad: dado que no estamos usando thingin switch` en ninguno de los cases anteriores, ¿cuál sería el uso aquí thing? No pude verlo. Gracias.
Unheilig
3
Lo importante es el valor que se prueba en cada caso. Entonces, si la cosa es una película, su valor estará vinculado a la película de símbolos.
Rob Napier
55
"Absolutamente puedes usar is" - y luego él nunca lo usa. X)
Raphael
3
@Raphael puedo ver case is Doubleen la respuesta
Gobe
2
@Gobe My bad, lo perdí. :> Mi excusa: ¿quizás no sea el ejemplo más ilustrativo?
Raphael
46

Poniendo el ejemplo para la operación "case is - case is Int, is String: ", donde se pueden usar múltiples casos juntos para realizar la misma actividad para tipos de Objetos similares. Aquí "," que separa los tipos en caso de que esté operando como un operador OR .

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

Enlace de demostración

Abhijeet
fuente
11
poner dos casos juntos solo para separarlos ifprobablemente no sea el mejor ejemplo para probar su punto.
cauteloso
1
Probablemente sería mejor si valuees algo que puede ser uno de Int, Float, Double, y el tratamiento Floaty Doublede la misma manera.
noamtm
30

En caso de que no tenga un valor, cualquier objeto:

rápido 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
fuente
17

Me gusta esta sintaxis:

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

ya que te da la posibilidad de extender la funcionalidad rápidamente, así:

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