Swift: Anahtar ifadesinde test sınıfı türü


209

Swift'te bir nesnenin sınıf türünü 'is' kullanarak kontrol edebilirsiniz. Bunu bir 'anahtar' bloğa nasıl dahil edebilirim?

Bence bu mümkün değil, bu yüzden bunun en iyi yolunun ne olduğunu merak ediyorum.

Yanıtlar:


441

Kesinlikle isbir switchblokta kullanabilirsiniz . Swift Programlama Dili'nde ( Anyelbette bununla sınırlı olmamasına rağmen) "Any ve AnyObject için Tür Dökümü" konusuna bakın . Kapsamlı bir örneği var:

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
Merhaba Rob. Sadece merak: Yukarıdaki bilgilerin thingherhangi birinde switch`de casekullanmadığımız için, buradaki kullanım ne olurdu thing? Göremedim. Teşekkürler.
Unheilig

3
şey her durumda test edilen değerdir. Bir şey bir Film ise, değeri sembol filmine bağlı olacaktır.
Rob Napier

5
"Kesinlikle kullanabilirsiniz is" - ve sonra asla kullanmaz. X)
Raphael

3
Görebildiğim @Raphael case is Doubleyanıtında
Gobe

2
@ Gobe My bad, kaçırdım. :> Özürüm: belki de en açıklayıcı örnek değil mi?
Raphael

46

"Case is - case is Int, is String: " işlemi için örnek vermek , burada birden fazla vaka benzer nesne türleri için aynı etkinliği gerçekleştirmek üzere bir araya getirilerek kullanılabilir. Burada "," duruma göre ayrılması OR operatörü gibi çalışmaktadır .

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

Demo Bağlantısı


11
iki vakayı sadece birbirinden ayırmak için bir araya getirmek ifmuhtemelen amacınızı kanıtlamak için en iyi örnek değildir.
savaşın

1
Bu muhtemelen daha iyi olurdu valuebiri olabilir şeydir Int, Float, Doubleve tedavi Floatve Doubleaynı şekilde.
noamtm

31

Bir değeriniz yoksa, yalnızca herhangi bir nesne:

hızlı 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

Bu sözdizimini beğendim:

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

çünkü size işlevselliği hızlı bir şekilde genişletme imkanı verir, örneğin:

switch thing {
case let myInt as Int: print("\(myInt) is Int")
case _ as Double: print("thing is Double")
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.