dartswitchpercabanganPemula3 mnt baca

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

dart
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:

dart
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:

dart
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?

dart
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)

dart
// 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;
  }
}
dart
// 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

dart
// SALAH: case tidak bisa berisi perbandingan
void main() {
  int nilai = 85;
  // switch (nilai) {
  //   case >= 90: // ERROR
  // }
}
dart
// 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

dart
// 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.

text
void main() {
  int kode = 3;
  // TODO
}