Advertisement
  1. Code
  2. Coding Fundamentals
  3. Tools

Swift dari Dasar: Optional dan Control Flow

Scroll to top
Read Time: 11 min
This post is part of a series called Swift From Scratch.
Swift From Scratch: Collections and Tuples
Swift From Scratch: An Introduction to Functions

() 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.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.