2014-09-08 3 views
127

In Swift können Sie den Klassentyp eines Objekts mit 'is' überprüfen. Wie kann ich das in einen 'Switch'-Block einbauen?Swift: Testklassentyp in switch-Anweisung

Ich denke, es ist nicht möglich, also frage ich mich, was der beste Weg ist.

TIA, Peter.

Antwort

251

Sie können is in einem switch Block absolut verwenden. Siehe "Casting für Any und AnyObject" in der Swift-Programmiersprache (obwohl es natürlich nicht auf Any beschränkt ist). Sie haben ein umfangreiches Beispiel:

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

Hallo, Rob. Nur Kuriosität: Da wir in keinem der oben genannten 'Fälle'' Schalter'' verwenden, was würde der Gebrauch von 'thing' bedeuten? Ich habe es nicht gesehen. Vielen Dank. – Unheilig

+3

ist der Wert, der in jedem Fall getestet wird. Wenn also ein Film ein Film ist, wird sein Wert an den Symbolfilm gebunden. –

+2

"Du kannst absolut' is' "benutzen - und dann benutzt er es nie. X) – Raphael

26

Setzen Sie das Beispiel oben für „Fall ist - Fall Int ist, ist String:“ -Operation, bei denen mehrere Fälle verwendet werden können geprügelt zusammen die gleiche Aktivität für ähnliches Objekt durchführen Arten. Hier "," die Trennung der Typen im Fall funktioniert wie ein OR Operator.

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

Demo Link

14

Falls Sie keinen Wert haben, nur jede Klasse:

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