2014-09-08 8 views
127

In Swift è possibile verificare il tipo di classe di un oggetto utilizzando 'is'. Come posso incorporare questo in un blocco 'switch'?Swift: tipo di classe di test nell'istruzione switch

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

TIA, Peter.

risposta

251

È assolutamente possibile utilizzare is in un blocco switch. Vedi "Digitare Casting per Any e AnyObject" nella Swift Programming Language (sebbene non sia limitato a Any ovviamente). 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

Ciao, Rob. Solo curiosità: poiché non usiamo 'thing' in switch' in nessuno dei' casi' sopra, quale sarebbe l'uso qui usando 'thing'? Non sono riuscito a vederlo. Grazie. – Unheilig

+3

cosa è il valore in fase di test in ogni caso. Quindi se la cosa è un film, il suo valore sarà legato al film simbolico. –

+2

"È assolutamente possibile utilizzare' is' "- e quindi non lo usa mai. X) – Raphael

26

Mettendo l'esempio per "caso è - caso è Int, è String:" operazione, dove più casi possono essere usate bastonato insieme per eseguire la stessa attività per oggetto simile tipi. Qui "," separare i tipi in caso funzioni come un operatore O.

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

Demo Link

14

Nel caso in cui non si dispone di un valore, di un qualsiasi classe:

func testIsString(aClass: AnyClass) { 
    switch aClass { 
    case is NSString.Type: 
    print(true) 
    default: 
    print(false) 
    } 
} 

testIsString(NSString.self) //->true 

let value: NSString = "some string value" 
testIsString(value.dynamicType) //->true 
Problemi correlati