Swift dari Dasar: Optional dan Control Flow
() translation by (you can also view the original English article)
Pada artikel sebelumnya, Anda mempelajari beberapa konsep dasar bahasa pemrograman Swift. Jika sudah diprogram sebelumnya, saya yakin Anda melihat beberapa kesamaan dengan bahasa pemrograman lainnya, seperti Ruby, JavaScript, dan Objective-C.
Pada artikel ini, kita belajar control flow di Swift. Sebelum kita bisa membahas control flow secara lebih rinci, kita perlu melihat konsep yang baru bagi kebanyakan Anda, optional. Optional adalah fitur keselamatan Swift yang lain. Pada awalnya, mungkin terlihat seperti kerumitan untuk menggunakan optional, tapi Anda akan segera mengetahui bahwa optional akan membuat kode Anda lebih aman.
1. Optional
Kita sudah melihat bahwa sebuah variabel harus diinisialisasi sebelum dapat digunakan. Lihatlah contoh berikut untuk lebih memahami apa artinya ini.
1 |
var str: String |
2 |
|
3 |
str.isEmpty |
Jika Anda terbiasa bekerja dengan string di Objective-C, mungkin Anda akan terkejut bahwa Swift menunjukkan kesalahan kepada Anda. Mari kita lihat apa kesalahan yang diberikan ke kita.



Dalam banyak bahasa, variabel memiliki nilai default awal. Dalam Objective-C, misalnya, string dalam cuplikan kode berikut sama dengan nil
.
1 |
NSString *newString; |
Namun, konsep nil
berbeda dalam Swift dan Objective-C. Kita akan membahas nil
secara lebih rinci nanti.
Apa itu optional?
Swift menggunakan optional untuk merangkum konsep penting, yaitu variabel atau konstan memiliki nilai atau tidak. Sesederhana itu di Swift. Untuk mendeklarasikan variabel atau konstan sebagai opsional, kita menambahkan tanda tanya ke jenis variabel atau konstan.
1 |
var str: String? |
Variabel str
bukan lagi tipe String
. Sekarang ada tipe optional String
. Hal ini penting untuk dipahami. Hasilnya atau efek sampingnya adalah kita tidak bisa lagi berinteraksi langsung dengan nilai variabel str
. Nilai aman disimpan dalam optional dan kita perlu meminta opsional untuk nilai itu encapsulates.
Pembukaan Paksa
Salah satu cara untuk mengakses nilai pilihan adalah dengan cara paksa. Kita bisa mengakses nilai variabel str
dengan menambahkan sebuah !
ke nama variabel
1 |
var str: String? |
2 |
|
3 |
str = "Test" |
4 |
|
5 |
println(str!) |
Penting agar Anda yakin bahwa optional berisi nilai saat Anda memaksa membukanya. Jika optional tidak memiliki nilai dan Anda memaksa melepaskannya, Swift akan melempar kesalahan pada Anda.



Optional Binding
Ada cara yang lebih aman untuk mengakses nilai optional. Kita akan melihat lebih dekat pernyataan if
dalam beberapa menit, namun contoh berikut menunjukkan bagaimana kita dapat dengan aman mengakses nilai yang tersimpan dalam variabel str
, yaitu tipe optional String
.
1 |
var str: String? |
2 |
|
3 |
if str != nil { |
4 |
println(str!) |
5 |
} else { |
6 |
println("str has no value") |
7 |
}
|
Pertama-tama kita periksa apakah variabel str
sama dengan nil
sebelum kita mencetak isinya. Dalam contoh ini, str
tidak memiliki nilai, yang berarti tidak akan dipaksa terbongkar oleh kecelakaan.
Ada pendekatan yang lebih elegan yang disebut optional binding. Dalam contoh berikut, kami menetapkan nilai yang tersimpan dalam optional ke konstanta sementara, yang digunakan dalam pernyataan if
. Nilai dari str
optional terikat pada strConst
konstan dan digunakan dalam if
statement. Pendekatan ini juga bekerja untuk pernyataan while
.
1 |
var str: String? |
2 |
|
3 |
str = "Test" |
4 |
|
5 |
if let strConst = str { |
6 |
println(strConst) |
7 |
} else { |
8 |
println("str has no value") |
9 |
}
|
Apa itu nil
?
Jika Anda berasal dari Objective-C, maka Anda pasti tahu apa itu nil
. Dalam Objective-C, nil
adalah pointer ke objek yang tidak ada. Swift mendefinisikan nil
sedikit berbeda dan penting bagi Anda untuk memahami perbedaannya.
Di Swift, nil
berarti tidak adanya nilai, nilai apapun. Sedangkan nil
hanya berlaku untuk objek di Objective-C, di Swift nil
bisa digunakan untuk tipe apapun. Oleh karena itu penting untuk dipahami bahwa suatu optional tidak setara dengan nil
di Objective-C. Konsep ini sangat berbeda.
2. Control Flow
Swift menawarkan sejumlah konstruksi umum untuk mengendalikan arus kode yang Anda tulis. Jika Anda memiliki pengalaman pemrograman, maka Anda tidak akan memiliki masalah untuk mempercepat konstruktor control flow Swift, pernyataan kondisional if
dan switch
, dan for
dan while
loop.
Namun, Swift tidak akan menjadi Swift jika control flownya tidak sedikit berbeda, misalnya, alur control flow Objective-C. Meskipun rinciannya penting, saya yakin mereka tidak akan menghalangi Anda bangkit dari Swift. Mari kita mulai dengan konstruk kondisional yang paling umum, pernyataan if
.
if
Pernyataan if
di Swift sangat mirip dengan yang ditemukan di Objective-C. Perbedaan utamanya adalah tidak perlu membungkus kondisi dalam tanda kurung. Kurung kurawal, bagaimanapun, adalah wajib. Yang terakhir ini mencegah pengembang untuk mengenalkan bug umum yang terkait dengan penulisan pernyataan if
tanpa kurung kurawal. seperti inilah peryataan if
di Swift.
1 |
let a = 10 |
2 |
|
3 |
if a > 10 { |
4 |
println("The value of \"a\" is greater than 10.") |
5 |
} else { |
6 |
println("The value of \"a\" is less than or equal to 10.") |
7 |
}
|
Tidak mengherankan jika Swift juga mendefinisikan else
. Kode di klausul else
dijalankan jika kondisinya sama dengan false
. Ini juga memungkinkan untuk rantai pernyataan if
seperti yang ditunjukkan pada contoh berikut.
1 |
let a = 10 |
2 |
|
3 |
if a > 10 { |
4 |
println("The value of \"a\" is greater than 10.") |
5 |
} else if a > 5 { |
6 |
println("The value of \"a\" is greater than 5.") |
7 |
} else { |
8 |
println("The value of \"a\" is less than or equal to 5.") |
9 |
}
|
Ada satu catatan penting yang harus dibuat, yaitu kondisi sebuah pernyataan if
perlu mengembalikan nilai true
atau false
. Ini pernyataan if
yang tidak benar di Objective-C. Lihatlah pernyataan if
berikut di Objective-C.
1 |
NSArray *array = @[]; |
2 |
|
3 |
if (array.count) { |
4 |
NSLog(@"The array contains one or more items."); |
5 |
} else { |
6 |
NSLog(@"The array is empty."); |
7 |
}
|
Jika kami memetakan potongan kode di atas ke Swift, kita akan mengalami kesalahan. Kesalahannya tidak terlalu informatif, tapi Swift memberi tahu kita bahwa kita perlu memastikan hasil dari kondisi tersebut untuk mengevaluasi true
atau false
.



Cara yang benar untuk menerjemahkan potongan Objective-C di atas ke Swift adalah dengan memastikan kondisi pernyataan if
dievaluasi true
atau false
, seperti pada cuplikan berikut.
1 |
let array = [String]() |
2 |
|
3 |
if array.count > 0 { |
4 |
println("The array contains one or more items.") |
5 |
} else { |
6 |
println("The array is empty.") |
7 |
}
|
switch
Pernyataan switch
di Swift lebih kuat daripada padanan Objective-C-nya. Ini juga lebih aman karena Anda akan belajar dalam sekejap. Meskipun ada beberapa perbedaan, pernyataan switch
di Swift mematuhi konsep yang sama seperti bahasa pemrograman lainnya, sebuah nilai dilewatkan ke pernyataan switch
dan dibandingkan terhadap kemungkinan pola pencocokan.
Itu benar, pola. Seperti yang saya katakan, sebuah pernyataan switch
di Swift memiliki beberapa trik. Kita akan melihat trik-trik itu dalam sekejap. Mari kita bicara tentang keamanan dulu.
Exhaustive
Pernyataan switch
di Swift perlu exhaustive, artinya setiap nilai yang mungkin dari tipe yang diserahkan ke pernyataan switch
perlu ditangani oleh pernyataan switch
. Seperti pada Objective-C, ini mudah dipecahkan dengan menambahkan case default
seperti pada contoh berikut.
1 |
let a = 10 |
2 |
|
3 |
switch a { |
4 |
case 0: |
5 |
println("a is equal to 0") |
6 |
case 1: |
7 |
println("a is equal to 1") |
8 |
default: |
9 |
println("a has another value") |
10 |
}
|
Gagal
Perbedaan penting dengan implementasi obyektif-C dari pernyataan switch
adalah kurangnya terobosan implisit. Contoh berikut tidak bekerja di Swift karena beberapa alasan.
1 |
let a = 10 |
2 |
|
3 |
switch a { |
4 |
case 0: |
5 |
case 1: |
6 |
println("a is equal to 1") |
7 |
default: |
8 |
println("a has another value") |
9 |
}
|
Kasus pertama di mana a
dibandingkan terhadap 0
tidak secara implisit jatuh ke kasus kedua di mana dibandingkan a
terhadap 1
. Jika Anda menambahkan contoh di atas ke playground Anda, Anda akan melihat bahwa Swift menunjukkan kesalahan pada Anda. Kesalahan mengatakan bahwa setiap kasus perlu menyertakan setidaknya satu pernyataan yang dapat dieksekusi.
Perhatikan bahwa kasus pernyataan switch
tidak menyertakan pernyataan break
untuk keluar dari pernyataan switch
. Ini tidak diperlukan di Swift karena implikasi implisit tidak ada di Swift. Ini akan menghilangkan berbagai bug umum yang disebabkan oleh penggabungan yang tidak disengaja.
Pattern
Kekuatan pernyataan switch
di Swift terletak pada pencocokan pola. Lihatlah contoh berikut yang telah saya gunakan untuk membandingkan nilai yang dipertimbangkan.
1 |
let a = 10 |
2 |
|
3 |
switch a { |
4 |
case 0..<5: |
5 |
println("The value of a lies between 0 and 4.") |
6 |
case 5...10: |
7 |
println("The value of a lies between 5 and 10.") |
8 |
default: |
9 |
println("The value of a is greater than 10.") |
10 |
}
|
Operator ..<
atau operator setengah terbuka menentukan kisaran dari nilai pertama ke nilai kedua, tidak termasuk nilai kedua. Operator ...
atau operator rentang tertutup mendefinisikan kisaran dari nilai pertama ke nilai kedua, termasuk nilai kedua. Operator ini sangat berguna dalam berbagai situasi.
Anda juga dapat membandingkan nilai yang dianggap dari pernyataan switch
ke tuple. Lihatlah contoh berikut untuk melihat bagaimana ini bekerja.
1 |
let latlng = (34.15, -78.03) |
2 |
|
3 |
switch latlng { |
4 |
case (0, 0): |
5 |
println("We're at the center of the planet.") |
6 |
case (0...90, _): |
7 |
println("We're in the Northern hemisphere.") |
8 |
case (-90...0, _): |
9 |
println("We're in the Southern hemisphere.") |
10 |
default: |
11 |
println("The coordinate is invalid.") |
12 |
}
|
Seperti yang dapat Anda lihat pada contoh di atas, ada kemungkinan nilai tersebut cocok dengan lebih dari satu kasus. Bila ini terjadi, kasus pencocokan pertama dipilih. Contoh di atas juga menggambarkan penggunaan underscore. Seperti yang kita lihat di artikel sebelumnya, kita bisa menggunakan garis bawah, _
, untuk memberi tahu Swift nilai mana yang tidak kita minati.
Value Binding
Pengikatan nilai juga dimungkinkan dengan pernyataan switch
seperti ditunjukkan oleh contoh berikut. Nilai kedua tupel untuk sementara terikat pada description
konstan untuk digunakan pada kasus pertama dan kedua.
1 |
var response = (200, "OK") |
2 |
|
3 |
switch response { |
4 |
case (200..<400, let description): |
5 |
println("The request was successful with description \(description).") |
6 |
case (400..<500, let description): |
7 |
println("The request was unsuccessful with description \(description).") |
8 |
default: |
9 |
println("The request was unsuccessful with no description.") |
10 |
}
|
for
for
loop adalah konstruktor loop pertama yang akan kita lihat. Ini berperilaku sangat mirip dengan for
loop dalam bahasa lain. Ada dua model, for
loop dan for-in
loop.
for
Swift's for
loop hampir identik dengan for
loop di Objective-C seperti contoh berikut. for
loop mengeksekusi sejumlah pernyataan sampai kondisi yang telah ditentukan terpenuhi.
1 |
for var i = 0; i < 10; i++ { |
2 |
println("i is equal to \(i).") |
3 |
}
|
Seperti halnya pernyataan if
, tidak perlu menggunakan tanda kurung untuk menyertakan inisialisasi, kondisi, dan definisi kenaikan loop. Pernyataan loop, bagaimanapun, memang perlu ditutupi oleh kurung kurawal.
for-in
for-in
loop ideal untuk perulangan di atas isi kisaran atau collection. Dalam contoh berikut, kita mengulang elemen dari sebuah array.
1 |
let numbers = [1, 2, 3, 5, 8] |
2 |
|
3 |
for number in numbers { |
4 |
println("number is equal to \(number)") |
5 |
}
|
Kita juga bisa menggunakan for-in
loop untuk melompati pasangan kunci-nilai kamus. Dalam contoh berikut, kami mendeklarasikan sebuah dictionary dan mencetak isinya ke konsol. Seperti yang kita lihat di awal seri ini, urutan pasangan kunci-nilai tidak terdefinisi karena dictionary adalah kumpulan pasangan nilai kunci yang tidak berurutan.
1 |
var bids = ["Tom": 100, "Bart": 150, "Susan": 120] |
2 |
|
3 |
for (name, bid) in bids { |
4 |
println("\(name)'s bid is $\(bid).") |
5 |
}
|
Setiap pasangan nilai kunci dari kamus tersedia dalam for-in
loop sebagai tupel konstanta yang dinamai. for-in
loop juga sangat bagus dalam kombinasi dengan rentang. Saya yakin Anda setuju bahwa cuplikan di bawah ini mudah dibaca dan dimengerti berkat penggunaan jarak tertutup.
1 |
for i in 1...10 { |
2 |
println("i is equal to \(i)") |
3 |
}
|
while
while
loop juga hadir dalam dua variasi, while
dan do-while
. Perbedaan utamanya adalah bahwa himpunan pernyataan dari do-while
loop selalu dijalankan setidaknya satu kali, karena kondisi dievaluasi pada akhir setiap iterasi. Contoh berikut menggambarkan perbedaan ini.
1 |
var c = 5 |
2 |
var d = 5 |
3 |
|
4 |
while c < d { |
5 |
println("c is smaller than d") |
6 |
}
|
7 |
|
8 |
do { |
9 |
println("c is smaller than d") |
10 |
} while c < d |
Pernyataan println
dari while
loop tidak pernah dijalankan saat loop do-while
dieksekusi sekali.
Dalam banyak kasus, for
loop dapat ditulis ulang sebagai while
loop dan seringkali sampai pengembang menentukan jenis loop yang akan digunakan dalam situasi tertentu. Berikut ini for
dan while
loop menghasilkan output yang sama.
1 |
for var i = 0; i < 10; i++ { |
2 |
println(i) |
3 |
}
|
4 |
|
5 |
var i = 0 |
6 |
|
7 |
while i < 10 { |
8 |
println(i) |
9 |
i++ |
10 |
}
|
Pelajari Lebih Lanjut di Kursus Pemrograman Swift Kami
Jika Anda tertarik untuk mengikuti pendidikan Swift Anda ke tingkat berikutnya, Anda dapat melihat kursus lengkap kami tentang pengembangan Swift.
Kesimpulan
Ada lebih banyak lagi untuk control flow di Swift daripada yang telah kita bahas dalam artikel ini, tapi sekarang Anda memiliki pemahaman dasar untuk melanjutkan perjalanan Anda ke Swift. Semoga tutorial ini menunjukkan kepada Anda bahwa implementasi control flow Swift sangat mirip dengan bahasa pemrograman lainnya, dengan twist.
Di sisa rangkaian ini, kita akan memanfaatkan struktur control flow Swift dan Anda secara bertahap akan mendapatkan pemahaman yang lebih baik tentang perbedaan halus dengan bahasa seperti Objective-C. Dalam angsuran berikutnya dari seri ini, kita mulai menjajaki fungsi.