Switch & Case
Percabangan banyak pilihan yang rapi dengan switch-case.
Ketika if-else terlalu panjang
Bayangkan kamu menulis menu restoran: jika pilih 1 tampilkan "Nasi goreng", jika pilih 2 "Mie ayam", jika pilih 3 "Soto"... sampai 20. Rantai else if sepanjang itu melelahkan dibaca. Switch-case adalah versi rapi untuk kasus "satu nilai dicocokkan ke banyak kemungkinan".
Analogi: if-else seperti resepsionis yang menanyai satu per satu ("apakah kamu tamu A? bukan? apakah tamu B?"). Switch seperti papan direktori di lobi: langsung tunjukkan lantainya berdasarkan nama.
Kenapa switch ada?
Dua alasan: keterbacaan (lebih jelas bahwa kita mencocokkan satu variabel ke banyak nilai) dan niat yang eksplisit (pembaca langsung tahu semua cabang saling lepas). Untuk 2-3 cabang, if-else tetap lebih ringkas. Untuk 4 atau lebih, switch menang.
Bentuk dasar
void main() {
int menu = 2;
switch (menu) {
case 1:
print('Nasi goreng');
break;
case 2:
print('Mie ayam');
break;
case 3:
print('Soto ayam');
break;
default:
print('Menu tidak tersedia');
}
}Cara kerja: nilai menu (2) dibandingkan ke tiap case. Ketemu case 2, jalankan isinya, lalu break keluar dari switch. Kalau tidak ada yang cocok, default yang dijalankan.
Contoh kedua dengan String:
void main() {
String hari = 'Sabtu';
String kegiatan;
switch (hari) {
case 'Senin':
case 'Selasa':
case 'Rabu':
case 'Kamis':
case 'Jumat':
kegiatan = 'Kerja';
break;
case 'Sabtu':
case 'Minggu':
kegiatan = 'Libur';
break;
default:
kegiatan = 'Hari tidak dikenal';
}
print('$hari waktunya $kegiatan');
}Beberapa case bisa "menumpuk" tanpa break di antaranya agar berbagi aksi yang sama. Pola ini elegan untuk pengelompokan.
Switch modern: switch expression
Dart modern (3.x) mendukung switch sebagai ekspresi yang menghasilkan nilai, lebih ringkas:
void main() {
int menu = 2;
String makanan = switch (menu) {
1 => 'Nasi goreng',
2 => 'Mie ayam',
3 => 'Soto ayam',
_ => 'Menu tidak tersedia',
};
print(makanan);
}Tanda => menggantikan case + break, dan _ menggantikan default. Bentuk ini wajib mencakup semua kemungkinan (exhaustive), sehingga lupa satu kasus langsung ketahuan saat compile.
Kapan pakai switch, kapan if-else?
void main() {
// PAKAI SWITCH: mencocokkan SATU nilai ke banyak opsi tetap
int kode = 404;
switch (kode) {
case 200:
print('OK');
break;
case 404:
print('Not found');
break;
case 500:
print('Server error');
break;
}
// PAKAI IF-ELSE: kondisi berupa rentang atau gabungan
int nilai = 85;
if (nilai >= 90) {
print('A');
} else if (nilai >= 80) {
print('B');
}
// switch tidak cocok untuk rentang seperti ini
}Aturan jempol: switch untuk persamaan nilai pasti (==), if-else untuk rentang dan kondisi kompleks.
Kesalahan umum pemula
1. Lupa break (di switch klasik)
// SALAH: tanpa break, eksekusi "jatuh" ke case berikutnya
void main() {
int menu = 1;
switch (menu) {
case 1:
print('Nasi goreng');
case 2:
print('Mie ayam'); // ikut tercetak!
break;
}
}// BENAR
void main() {
int menu = 1;
switch (menu) {
case 1:
print('Nasi goreng');
break;
case 2:
print('Mie ayam');
break;
}
}Untungnya Dart melarang fall-through implisit antar case yang berisi statement, jadi error ini lebih sering muncul sebagai compile error daripada bug diam-diam.
2. Memakai switch untuk rentang
// SALAH: case tidak bisa berisi perbandingan
void main() {
int nilai = 85;
// switch (nilai) {
// case >= 90: // ERROR
// }
}// BENAR: rentang tetap tugas if-else
void main() {
int nilai = 85;
if (nilai >= 90) {
print('A');
} else {
print('Bukan A');
}
}3. Tipe case tidak cocok dengan yang di-switch
// SALAH
void main() {
int menu = 2;
switch (menu) {
// case '2': // ERROR: String vs int
case 2:
print('Mie ayam');
break;
}
}Nilai di case harus bertipe sama dengan ekspresi di switch.
Kesimpulan
Switch-case merapikan pencocokan satu nilai ke banyak kemungkinan. Switch klasik pakai case/break/default, switch expression modern pakai => dan _. Pilih switch untuk nilai pasti, if-else untuk rentang.
Catatan teknis: Switch expression wajib exhaustive. Untuk tipe enum, compiler memeriksa semua nilai enum tercakup. Ini salah satu contoh bagaimana Dart menangkap kelalaian sejak compile time.
Tantangan
Penerjemah kode hari
Diberi angka 1-7, cetak nama hari (1=Senin ... 7=Minggu). Angka lain cetak "Kode salah". Pakai switch.
void main() {
int kode = 3;
// TODO
}