Swift: Jenis kelas tes dalam pernyataan sakelar

208

Di Swift Anda dapat memeriksa tipe kelas dari objek menggunakan 'is'. Bagaimana saya bisa memasukkan ini ke dalam blok 'switch'?

Saya pikir itu tidak mungkin, jadi saya bertanya-tanya apa cara terbaik untuk ini.

kingrolo
sumber

Jawaban:

438

Anda benar-benar dapat digunakan isdalam satu switchblok. Lihat "Ketik Pengecoran untuk Apa Saja dan AnyObject" di Bahasa Pemrograman Swift (meskipun tentu saja tidak terbatas Any). Mereka memiliki contoh yang luas:

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")
    }
}
Rob Napier
sumber
2
Hai, Rob. Hanya rasa ingin tahu: karena kita tidak menggunakan thingdi dalam saklar di salah satu dari yang casedi atas, apa yang akan digunakan di sini menggunakan thing? Saya gagal melihatnya. Terima kasih.
Unheilig
3
hal adalah nilai yang diuji dalam setiap kasus. Jadi jika sesuatu adalah Film, nilainya akan terikat pada film simbol.
Rob Napier
5
"Kamu benar-benar dapat menggunakan is" - dan kemudian dia tidak pernah menggunakannya. X)
Raphael
3
@ Raphael saya bisa melihat case is Doubledalam jawabannya
Gobe
2
@ Ayolah, buruk saya, melewatkannya. :> Alasan saya: mungkin itu bukan contoh yang paling ilustratif?
Raphael
46

Menampilkan contoh untuk "case is - case is Int, adalah operasi String: ", di mana banyak case dapat digunakan dipukul bersama untuk melakukan aktivitas yang sama untuk tipe Object yang Mirip. Di sini "," memisahkan jenis jika beroperasi seperti operator ATAU .

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

Demo Link

Abhijeet
sumber
11
menyatukan dua case hanya untuk memisahkan mereka ifmungkin bukan contoh terbaik untuk membuktikan pendapat Anda.
warly
1
Mungkin akan lebih baik jika valueadalah sesuatu yang dapat menjadi salah satu Int, Float, Double, dan mengobati Floatdan Doubledengan cara yang sama.
noamtm
30

Jika Anda tidak memiliki nilai, sembarang objek:

cepat 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
Prcela
sumber
17

Saya suka sintaks ini:

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

karena memberi Anda kemungkinan untuk memperluas fungsi dengan cepat, seperti ini:

switch thing {
case let myInt as Int: print("\(myInt) is Int")
case _ as Double: print("thing is Double")
}
Daniel
sumber