Noop untuk Exhaustive Switch Statements Swift

90

Swift membutuhkan pernyataan switch yang lengkap, dan setiap case memiliki kode yang dapat dieksekusi.

Label 'case' dalam 'switch' harus memiliki setidaknya satu pernyataan yang dapat dieksekusi

Adakah yang sudah memutuskan cara yang baik untuk menangani kasus-kasus di mana Anda sebenarnya tidak ingin melakukan apa-apa? Saya bisa meletakkan println () di sana, tapi itu terasa kotor.

Sean McMains
sumber

Jawaban:

151

Menurut buku itu , Anda perlu menggunakannya di breaksana:

Cakupan setiap kasus tidak boleh kosong. Akibatnya, Anda harus menyertakan setidaknya satu pernyataan setelah titik dua (:) dari setiap label huruf. Gunakan satu breakpernyataan jika Anda tidak bermaksud untuk mengeksekusi kode apa pun di badan kasus yang cocok.

Sergey Kalinichenko
sumber
8
Oh, sekali lagi Swift melanggar hukum kejutan minimum :)
Sulthan
10
@Jiaaro Kebutuhan untuk breakmenunjukkan bahwa cabang tanpa breakmungkin jatuh.
RnMss
4
Seorang ()wajan sederhana juga. Namun demikian saya lebih suka breakkarena membuat segalanya lebih jelas. Gunakan kata kunci fallthrouguntuk melewati pernyataan.
cLar
1
Ini cukup mengganggu ketika Anda ingin mengomentari secara singkat satu-satunya baris yang ada dalam default:kasus ini. Sepertinya itu bukan hal yang baik. Saya juga setuju bahwa itu menunjukkan perilaku c's fall through, yang bukan apa yang dilakukan Swift (senang mengetahui itu bisa gagal).
Benjohn
1
Dan saya harus datang ke sini hanya untuk memastikan bahwa jeda tidak akan menghentikan putaran penutup lebih awal ..
JulianSymes
12

Anda dapat menggunakan breakpernyataan:

let vegetable = "red pepper"
var vegetableComment: String = "Nothing"
switch vegetable {
case "cucumber", "watercress":
    break // does nothing
case let x where x.hasSuffix("pepper"):
    vegetableComment = "Is it a spicy \(x)?"
default:
    vegetableComment = "Everything tastes good in soup."
}

Contoh dimodifikasi dari dokumen

Firo
sumber
3

Di bawah ini adalah salah satu opsi untuk pernyataan null, tetapi mungkin bukan solusi yang baik. Saya tidak dapat menemukan pernyataan seperti python pass

{}() 

untuk sakelar, istirahat adalah pilihan yang lebih baik.

break
lbsweek
sumber
1

Selain breakdisebutkan dalam jawaban lain, saya juga melihat ()pernyataan tidak boleh digunakan:

switch 0 == 1 {
case true:
    break
case false:
    ()
}

Gunakan ()jika Anda merasa breakbingung atau ingin menyimpan 3 karakter.

pkamb
sumber
0

Solusi terbersih yang saya temukan adalah dengan menyertakan pernyataan terakhir Anda dalam kasus sakelar sebagai default Anda. Ini menghindari kebutuhan untuk menambahkan breakatau pernyataan tidak perlu lainnya sambil tetap mencakup semua kemungkinan kasus.

Sebagai contoh:

switch myVar {

case 0:
    myOtherVar = "Red"

case 1:
    myOtherVar = "Blue"

default:
    myOtherVar = "Green"

}
scottyhardy
sumber
1
Halo @scottyy. Ini sebenarnya bukan inti dari pertanyaannya. Anda menulis jawaban atas pertanyaan: "Bagaimana menghindari keharusan menambahkan kasus default kosong" (atau sesuatu di sepanjang baris itu). Dalam kasus Anda, Anda sebenarnya melakukan sesuatu dalam semua kasus. Tetapi katakanlah Anda memiliki kasus (seperti nomor 2 misalnya) di mana Anda tidak ingin melakukan apa pun, maka dalam kasus itu Anda kembali ke pertanyaan yang sama: apa yang harus dilakukan ketika dalam kasus sakelar kita tidak ingin untuk melakukan apa saja? Singkat cerita: gunakan istirahat.
Enricoza
0

Jangan lakukan apa pun dalam pernyataan kasus peralihan yang lengkap:

Cepat:

switch yourVariable {
case .someCase:
    break
}

SwiftUI:

switch yourVariable {
case .someCase:
    EmptyView() // break does not work with ViewBuilder
}

Menggunakan EmptyView () sebagai ganti putus dalam tampilan SwiftUI mencegah kesalahan:

Penutupan yang berisi pernyataan aliran kontrol tidak dapat digunakan dengan pembuat fungsi ViewBuilder.

EmptyView () adalah tampilan standar SwiftUI (diuji dengan Xcode 12, iOS 14) dan tidak perlu ditentukan sendiri.

sist
sumber
0

Anda dapat memeriksa kasus tertentu, tidak perlu exhustivedengan switch cases

Katakanlah Anda memiliki enum seperti ini,

enum Selection {
        case one
        case two
        case three
    }
var myCase = Selection.one
    

Anda dapat memeriksa seperti ini,

    if case .one = myCase {
        print("one")
    }
Yodagama
sumber