Swift: prova il tipo di classe nell'istruzione switch


208

In Swift puoi controllare il tipo di classe di un oggetto usando 'is'. Come posso incorporarlo in un blocco 'switch'?

Penso che non sia possibile, quindi mi chiedo quale sia il modo migliore per aggirare questo.

Risposte:


438

Puoi assolutamente usarlo isin un switchblocco. Vedi "Digitare Casting per Any e AnyObject" nel linguaggio di programmazione Swift (anche se non si limita Anyovviamente). Hanno un ampio esempio:

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
Hi, Rob. Just curiosity: since we are not using thing in switch` in any of the cases above, what would be the use here using thing? I failed to see it. Thanks.
Unheilig

3
cosa è il valore testato in ciascun caso. Quindi, se la cosa è un film, il suo valore sarà legato al film simbolo.
Rob Napier,

5
"Puoi assolutamente usare is" - e poi non lo usa mai. X)
Raffaello,

3
@Raphael Riesco a vedere case is Doublenella risposta
Gobe

2
@Gobe Mio male, l'ho perso. :> La mia scusa: forse non è l'esempio più illustrativo?
Raffaello,

46

Mettendo l'esempio per "case is - case is Int, is String: " operazione, in cui è possibile utilizzare più casi raggruppati insieme per eseguire la stessa attività per tipi di oggetti simili. Qui "," la separazione dei tipi nel caso in cui funzioni come un operatore OR .

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

Link dimostrativo


11
mettere insieme due casi solo per separarli tramite non ifè probabilmente il miglior esempio per dimostrare il tuo punto.
warly

1
Probabilmente sarebbe meglio se valueè qualcosa che può essere uno dei Int, Float, Double, e nel trattamento Floate Doublenello stesso modo.
noamtm,

30

Nel caso in cui non si abbia un valore, qualsiasi oggetto:

veloce 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

Mi piace questa sintassi:

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

poiché ti dà la possibilità di estendere rapidamente la funzionalità, in questo modo:

switch thing {
case let myInt as Int: print("\(myInt) is Int")
case _ as Double: print("thing is Double")
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.