I. Percabangan dasar if / if-else
- Ekspresi di dalam kurung
ifwajib bertipe boolean; konversi implisit ke tipe boolean tidak diizinkan. - Kita bisa merangkai beberapa blok
else if, dengan blokelseopsional di bagian akhir. - Kurung kurawal boleh dihilangkan jika hanya ada satu baris kode, tapi disarankan pakai selalu agar kode mudah dibaca.
void main() {
bool isRaining = false;
bool isSnowing = true;
if (isRaining) {
print("Bawa jas hujan");
} else if (isSnowing) {
print("Pakai jaket tebal");
} else {
print("Berkendara mobil atap terbuka");
}
}Code language: Dart (dart)
Hasil eksekusi
D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
Pakai jaket tebalCode language: CSS (css)
Kita juga bisa pakai if sendirian tanpa cabang lain
void main() {
bool isRaining = false;
bool isSnowing = true;
if (isRaining) {
print("Bawa jas hujan");
}
}Code language: Dart (dart)
Atau hanya gunakan konstruksi if else saja
void main() {
bool isRaining = false;
bool isSnowing = true;
if (isRaining) {
print("Bawa jas hujan");
} else {
print("Berkendara mobil atap terbuka");
}
}Code language: Dart (dart)
II. Percabangan pencocokan pola if-case (Dart 3.0+)
- Jika pola cocok, variabel akan didestruktur dan terikat ke cakupan lingkup saat ini.
- Jika pencocokan gagal, eksekusi pindah ke else. Bisa tambahkan penjaga
whenuntuk pengecekan boolean tambahan. - Didesain untuk pencocokan satu nilai dengan satu pola; gunakan switch jika perlu menangani banyak pola sekaligus.
void main() {
final pair = [100, 220];
// Cocok dengan daftar berisi dua bilangan bulat
if (pair case [int x, int y]) {
print("Koordinat: $x,$y");
} else {
throw FormatException("Koordinat tidak valid");
}
}Code language: Dart (dart)
Hasil eksekusi
D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
Koordinat: 10,20Code language: CSS (css)
2: if-case digabung penjaga when
void main() {
final data = [8, 9];
if (data case [int a, int b] when a > 5 && b > 5) {
print("Kedua bilangan lebih besar dari 5");
} else {
print("Bilangan tidak memenuhi syarat");
}
}Code language: Dart (dart)
Hasil eksekusi
D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
Kedua bilangan lebih besar dari 5Code language: CSS (css)
III. Pernyataan switch
Switch tradisional berbentuk pernyataan, tidak memiliki nilai kembalian
- Case mendukung semua jenis pola: string, konstanta, OR logika, pola relasional
- Case yang berisi kode akan berhenti otomatis dengan break, tidak perlu tulis break manual; case kosong akan menyebabkan fallthrough implisit.
- Dua cara buat fallthrough manual:
continue label/ rangkaian case kosong berturut-turut - Jika tidak ada case yang cocok, blok
defaultakan dijalankan; mendukung penjagawhen
1: Pencocokan string dasar
void main() {
String command = "OPEN";
switch (command) {
case "CLOSED":
print("Jalankan logika tutup");
case "PENDING":
print("Jalankan logika tunggu");
case "OPEN":
print("Jalankan logika buka");
default:
print("Perintah tidak diketahui");
}
}
Code language: Dart (dart)
Hasil eksekusi
D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
Jalankan logika bukaCode language: CSS (css)
2: Fallthrough case kosong + lompat pakai continue label
String command = "OPEN";
switch (command) {
case "OPEN":
print("Operasi buka"); // ① Cocok dengan OPEN lalu cetak teks
continue newCase; // ② Lompat langsung ke label newCase, tidak kembali
case "DENIED":
case "CLOSED":
print("Operasi tutup");
newCase: // ③ Tujuan lompatan
case "PENDING":
print("Logika terpadu proses tertunda"); // ④ Dijalankan tanpa cek command == "PENDING"
}Code language: Dart (dart)
Hasil eksekusi
D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
Operasi buka
Logika terpadu proses tertundaCode language: CSS (css)
Dalam contoh ini
continue newCase;melompat ke label newCase, tapi case berikutnya “PENDING” tidak cocok, kenapa kodeprint("Logika terpadu proses tertunda");tetap berjalan?Ini pertanyaan yang sering muncul dari pembaca
continue label; tidak membandingkan ulang nilai yang diuji, melainkan melompat langsung ke awal blok case berlabel, melewati semua pengecekan kondisi dan menjalankan kode blok seketika.
3: switch dengan penjaga when
void main() {
int score = 88;
switch (score) {
case int s when s >= 90:
print("Sangat baik");
case int s when s >= 60:
print("Lulus");
default:
print("Tidak lulus");
}
}
Code language: Dart (dart)
Hasil cetak: Lulus
Pertama dicek tipe data: nilai harus bilangan bulat. Jika cocok, nilai dimasukkan ke variabel s lalu penjaga when lakukan pengecekan kedua; kode case hanya berjalan jika s memenuhi syarat di when. Dua tulisan int s memiliki lingkup terpisah dan tidak saling mengganggu.
Setiap case int s adalah pengikatan pola mandiri, lingkup variabel hanya terbatas di blok case miliknya sendiri.
Kita bisa pakai nama variabel berbeda di dua case tanpa mengubah perilaku program.
switch (score) {
case int a when a >= 90:
print("Sangat baik");
case int b when b >= 60:
print("Lulus");
default:
print("Tidak lulus");
}Code language: Dart (dart)
IV. Ekspresi switch
Sintaks tersedia sejak Dart 3.0, memiliki nilai kembalian dan sering dipakai untuk penugasan variabel
Perbedaan dengan pernyataan switch
- Tidak ada kata kunci
case, simbol=>memisahkan pola dan ekspresi kembalian - Setiap cabang wajib mengembalikan ekspresi, cabang dipisah koma
- Tidak ada fallthrough otomatis, tiap cabang mandiri. Jika tidak ada pola cocok gunakan garis bawah
_bukan default - Bisa dipakai langsung di penugasan, panggilan print, return dan semua konteks ekspresi
1: Pencocokan operator karakter dasar (pola OR logika)
void main() {
const slash = 47, star = 42, comma = 44;
int charCode = 42;
final token = switch (charCode) {
slash || star => "Operator",
comma => "Tanda baca",
_ => "Karakter tidak valid"
};
print(token);
}
Code language: Dart (dart)
Hasil eksekusi
Operator
Contoh ini mendefinisikan konstanta kode ASCII tiga simbol, variabel charCode mengklasifikasikan karakter sebagai operator, tanda baca atau simbol tidak sah.
2: Ekspresi switch dengan penjaga when
void main() {
int age = 22;
String level = switch (age) {
int a when a < 18 => "Di bawah umur",
int a when a < 30 => "Dewasa muda",
_ => "Dewasa"
};
print(level);
}Code language: Dart (dart)
Hasil eksekusi
Dewasa muda
3: Pakai ekspresi switch langsung di return fungsi
void main() {
print(getDesc(3));
}
String getDesc(int num) => switch (num) {
1 => "Satu",
2 => "Dua",
_ => "Bilangan lain"
};
Code language: Dart (dart)
Hasil eksekusi
Bilangan lain
Catatan: Di sini switch adalah ekspresi dan getDesc adalah fungsi panah. Fungsi panah sintaks khas Dart yang tidak ada di bahasa keluarga C lainnya.
V. Pemeriksaan kelengkapan pencocokan (Exhaustiveness Checking)
Akan muncul error kompilasi jika ada nilai input tanpa case yang sesuai, kompilator memaksa kita melengkapi semua cabang. Kelas sealed dan enum secara bawaan mendukung pemeriksaan lengkap tanpa perlu _ atau default.
1: Error kurang lengkap untuk boolean nullable (beri komentar/hapus komentar lihat error)
void main() {
bool? nullableBool = null;
// Hapus komentar kode di bawah akan error kompilasi: tidak ada case null dan tidak ada cadangan _/default
/*
switch (nullableBool) {
case true:
print("Benar");
case false:
print("Salah");
}
*/
// Cara perbaiki: tambah case null atau cadangan pakai _
switch (nullableBool) {
case true:
print("Benar");
case false:
print("Salah");
case null:
print("Nilai null");
}
}Code language: PHP (php)
Hasil eksekusi
Nilai nullCode language: JavaScript (javascript)
2: Kelas sealed (terkunci)
Tipe data aljabar yang memaksa pencocokan pola lengkap
import 'dart:math' as math;
// Kelas sealed: subkelas hanya bisa dibuat di file ini saja
sealed class Shape {}
// Subkelas Kotak: panjang sisi
class Square implements Shape {
final double length;
Square(this.length);
}
//Subkelas Lingkaran: jari-jari
class Circle implements Shape {
final double radius;
Circle(this.radius);
}
// Fungsi panah hitung luas dengan pencocokan switch objek subkelas yang diterima
double calculateArea(Shape shape) => switch (shape) {
Square(length: var l) => l * l,
Circle(radius: var r) => math.pi * r * r
// Tambah subkelas baru Shape akan muncul error kompilasi karena case kurang
};
void main() {
final Shape circle = Circle(5);
print(calculateArea(circle));
final Shape square = Square(4);
print(calculateArea(square));
}
Code language: Dart (dart)
Hasil eksekusi
78.53981633974483
16.0Code language: CSS (css)
3: Pencocokan lengkap enum
Tidak butuh garis bawah cadangan _
void main() {
final Animal animal = Animal.cat;
String name = switch (animal) {
Animal.dog => "Anjing",
Animal.cat => "Kucing"
};
print(name);
}
enum Animal { dog, cat }
Code language: Dart (dart)
Hasil cetak: Kucing
Enum memiliki kumpulan nilai tetap terbatas sehingga tidak perlu cabang cadangan.
VI. Penjaga when
Dukungan penuh di if-case, pernyataan switch dan ekspresi switch
Fungsi when: lakukan pengecekan boolean tambahan setelah pola cocok. Jika penjaga menghasilkan false, lanjut ke cabang berikut tanpa keluar dari switch.
1. if-case + when
void main() {
List<int> arr = [10, 20];
if (arr case [int x, int y] when x + y > 20) {
print("Jumlah dua bilangan lebih dari 20");
}
}Code language: Dart (dart)
Jumlah dua bilangan lebih dari 20
Pertama dicek apakah variabel daftar dua bilangan bulat, jika cocok when cek apakah jumlahnya melebihi 20.
2. Pernyataan switch + when
void main() {
int num = 15;
switch(num) {
case int n when n % 2 == 0:
print("Bilangan genap");
case int n when n % 2 != 0:
print("Bilangan ganjil");
}
}
Code language: PHP (php)
Hasil cetak: Bilangan ganjil
Pertama konfirmasi tipe bilangan bulat lalu cek syarat di dalam when.
3. Ekspresi switch + when
void main() {
int num = 15;
String res = switch(num) {
int n when n % 2 == 0 => "Bilangan genap",
_ => "Bilangan ganjil"
};
print(res);
}
Code language: PHP (php)