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.

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

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


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

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")
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.