1. Pola Logika OR A || B
Cocok dengan salah satu subpola saja; semua cabang harus mendefinisikan kumpulan variabel yang sama persis.
enum Color { red, yellow, blue, green }
void main() {
Color c = Color.red;
bool primary = switch(c) {
Color.red || Color.yellow || Color.blue => true,
_ => false
};
print(primary); // true
}Code language: Dart (dart)
2. Pola Logika AND A && B
Kedua subpola harus cocok secara bersamaan; subpola tidak boleh mengikat variabel dengan nama yang sama.
void main() {
switch((2, 3)) {
// Kesalahan: kedua subpola mengikat variabel b, terjadi bentrok nama variabel
// case (var a, var b) && (var b, var c): print("ok");
case (var a, var b) && (>1, <5):
print("a=$a,b=$b"); // a=2,b=3
}
}Code language: Dart (dart)
Tulisan (>1, <5) berarti angka pertama harus lebih besar dari 1 dan angka kedua harus lebih kecil dari 5.
3. Pola Relasional < > <= >= == !=
Digunakan untuk pengecekan rentang angka, sering digabung dengan && guna membatasi batas nilai
String asciiCharType(int charCode) {
const space = 32, zero = 48, nine = 57;
return switch(charCode) {
< space => "Karakter kontrol",
== space => "Spasi",
> space && < zero => "Tanda baca",
>= zero && <= nine => "Angka",
_ => "Lainnya"
};
}
void main() {
print(asciiCharType(50)); // Angka
print(asciiCharType(33)); // Tanda baca
}Code language: Dart (dart)
Contoh ini menggunakan kode ASCII untuk mengklasifikasikan karakter kontrol, angka dan simbol. Aturan pengecekan charCode pada switch: kurang dari 32 = karakter kontrol, sama dengan 32 = spasi, antara 32 dan 48 = tanda baca, 48 sampai 57 inklusif = angka, semua nilai lainnya dikategorikan sebagai lainnya.
4. Pola Konversi Tipe Paksa sub as Type
Melakukan konversi tipe eksplisit saat destrukturisasi; jika tipe tidak cocok akan memunculkan pengecualian saat runtime
void main() {
(num, Object) rec = (10, "hello");
var (i as int, s as String) = rec;
print(i + 5); // 15
print(s.toUpperCase()); // HELLO
}Code language: Dart (dart)
Dalam contoh ini, record rec dipecah menjadi variabel i dan s. Jika elemen pertama bukan bilangan bulat atau elemen kedua bukan string, akan muncul kesalahan runtime.
Lihat contoh yang error di bawah ini:
void main() {
(num, Object) rec = (9.3, "hello");
var (i as int, s as String) = rec;
print(i + 5); // 15
print(s.toUpperCase()); // HELLO
}Code language: Dart (dart)
D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
Unhandled exception:
type 'double' is not a subtype of type 'int' in type cast
#0 main (file:///D:/dartdemo/firstdart/bin/firstdart.dart:3:10)
#1 _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:314:19)
#2 _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:193:12)Code language: PHP (php)
5. Pola Pemeriksaan Null sub?
Hanya cocok jika nilai bukan null; variabel di dalamnya otomatis naik tipe menjadi tipe tidak boleh null. Jika bernilai null, pencocokan gagal tanpa memunculkan error.
void main() {
String? str = "test";
switch(str) {
case var s?:
print(s.length); // s adalah string tidak boleh null, output 4
case null:
print("Nilai kosong");
}
}Code language: Dart (dart)
6. Pola Penegasan Non-Null sub!
Hanya cocok jika nilai bukan null; apabila nilainya null, langsung lempar pengecualian runtime
void main() {
List<String?> row = ["user", "bob"];
switch(row) {
case ["user", var name!]:
print(name); // name adalah string tidak boleh null
}
// Penggunaan pada destrukturisasi variabel
(int?, int?) pos = (2, 3);
var (x!, y!) = pos;
print(x + y);
}Code language: Dart (dart)
Penjelasan var name!
var name:Pola Variabel — kata kuncivarmendeklarasikan variabel lokal barunamedan mengikat nilai jika pencocokan berhasil;!:Pola Penegasan Null Postfix — mewajibkan nilai saat ini tidak boleh null; jika null akan muncul error runtime.
Makna gabungan: var name! membuat variabel baru name sekaligus menjamin nilainya tidak mungkin null.
7. Pola Konstanta
Literal, konstanta bernama, konstruktor const dan koleksi const semuanya termasuk pola konstanta; akan cocok jika nilainya sama persis
Tipe yang didukung: angka, string, boolean, konstanta bernama, objek / daftar dengan const
void main() {
const target = 10;
int num = 10;
switch(num) {
case 1: print("Satu");
case target: print("Cocok dengan konstanta 10");
case const [1,2]: print("Daftar konstanta");
default: print("Lainnya");
}
}Code language: Dart (dart)
Hasil eksekusi program
Cocok dengan konstanta 10
8. Pola Variabel var x / int x / final x
Mengikat variabel lokal baru saat pencocokan berhasil; jika diberi anotasi tipe akan sekaligus validasi tipe nilai
void main() {
switch((99, "dart")) {
case (int a, String b):
print("$a $b"); // 99 dart
case (int a, int b):
print("Dua nilai numerik");
}
}Code language: Dart (dart)
9. Pola Identifikator
Perilakunya terbagi menjadi tiga konteks:
- Konteks deklarasi
var (a,b):Membuat variabel baru - Konteks penugasan
(a,b) = val:Menimpa variabel yang sudah ada - Konteks pencocokan switch:Diperlakukan sebagai konstanta (kecuali
_)
void main() {
const c = 5;
int val = 2;
switch(val) {
case c: print("Cocok dengan konstanta c");
default: print("Tidak ada kecocokan"); // Baris ini akan dieksekusi
}
}
Code language: Dart (dart)
10. Pola Kurung (subPattern)
Mengubah prioritas operator pola guna memisahkan urutan evaluasi antara || dan &&
void main() {
bool x = true, y = true, z = false;
bool test = switch(true) {
(x || y) && z => true,
_ => false
};
print(test); // false
}
Code language: Dart (dart)
11. Pola Daftar
Cocok dengan objek List dan memecah elemen berdasarkan posisi; mendukung operator rest ... untuk menangkap sisa elemen berapapun jumlahnya
1. Pencocokan daftar dasar
void main() {
const a = "a", b = "b";
var arr = ["a", "b"];
switch(arr) {
case [a, b]: print("Kecocokan ditemukan");
default: print("Tidak ada kecocokan");
}
}Code language: Dart (dart)
2. Menangkap sisa elemen dengan rest
void main() {
var [a, b, ...rest, c, d] = [1,2,3,4,5,6,7];
print("$a $b $rest $c $d"); // 1 2 [3, 4, 5] 6 7
}
Code language: Dart (dart)
D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
1 2 [3, 4, 5] 6 7Code language: CSS (css)
12. Pola Map {"key": subP}
Cocok dengan objek Map dan hanya validasi kunci yang ditentukan; jika kunci target tidak ada akan muncul StateError, kunci tambahan yang tidak disebutkan akan diabaikan
void main() {
var data = {"user": ["Lily", 13]};
if(data case {"user": [String name, int age]}) {
print("$name $age"); //Lily 13
}
}Code language: JavaScript (javascript)
13. Pola Record
Ada dua jenis: record posisi (p1,p2), record bernama (k:p1,k2:p2)
Mendukung singkatan :var untuk menghilangkan nama field yang berulang
void main() {
// Destrukturisasi record posisi
var (name, age) = ("Doug", 25);
// Destrukturisasi singkatan field bernama
final (:name, :age) = (name: "Tom", age: 18);
}
Code language: JavaScript (javascript)
14. Pola Objek Class(prop: p)
Cocok dengan objek tipe yang ditentukan dan memecah properti getter; tersedia singkatan :var
class Point {
final int x, y;
Point(this.x, this.y);
}
void main() {
Point p = Point(10, 20);
var Point(:x, :y) = p;
print("$x $y");
}
Code language: JavaScript (javascript)
15. Pola Wildcard _
Cocok dengan nilai apapun tanpa mengikat variabel; dipakai sebagai pengganti tempat atau hanya validasi tipe tanpa mengambil nilai
void main() {
var arr = [1,2,3];
var [_, mid, _] = arr;
print(mid); // 2
switch((10, "abc")) {
case (int _, String _):
print("Pencocokan tipe berhasil");
}
}Code language: JavaScript (javascript)
Pattern