0Pricing
Swift Academy · Pelajaran

Closure

Closure

Closure adalah pelajaran Swift Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 1. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Swift Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Swift Academy mencakup 1 pelajaran total.

Pendahuluan

Halo,

Closure adalah blok kode mandiri. Closure dapat diteruskan sebagai parameter ke kode lain atau digunakan di dalam kode.

Closure merupakan jenis fungsi. Closure dapat digunakan dengan meneruskannya ke dalam kode. Closure mirip dengan lambda dalam bahasa pemrograman lain.

Manajemen Memori

Salah satu hal terpenting adalah bahwa closure dapat menyimpan nilai konstanta dan variabel dalam konteks tempat closure tersebut didefinisikan.

Penyimpanan ini dikenal sebagai penangkapan konteks.

Swift menangani manajemen memori selama proses penyimpanan ini untuk kita.

Jenis Closure

Ada beberapa jenis closure.

  1. Fungsi global adalah closure yang memiliki nama. Fungsi ini tidak menyimpan nilai apa pun.
  2. Fungsi bersarang dapat membawa nilai nama dan fungsi yang membungkusnya.
  3. Ekspresi closure, di sisi lain, adalah closure tanpa nama yang dapat menyimpan data dari konteks di sekitarnya dengan sintaks sederhana.

Sintaks Closure

Sintaks closure dibuat sesederhana mungkin. Beberapa hal terpenting di antaranya adalah sebagai berikut.

  • Parameter dalam closure dapat disimpulkan.
  • Nilai kembalian dapat disimpulkan.
  • Pengembalian closure dapat ditulis dalam satu baris.
  • Nama argumen dapat dinyatakan sebagai singkatan seperti $ 0 atau $ 1.
  • Sintaks trailing closure dapat digunakan.

Informasi

Ekspresi closure berarti menulis closure secara langsung, dengan berfokus pada sintaks dan kesederhanaan.

Sintaks Closure

Sintaks closure ditunjukkan dalam kode contoh di bawah.

{ (parameters) -> return type in
    statements
}


func backward(_ s1: String, _ s2: String) -> Bool {
    return s1 > s2
}
//If we didn't use closures, our code structure would be as follows.

var reversedNames = names.sorted(by: backward)

Sintaks Closure

Namun, dengan closure, kita tidak perlu membuat closure global bernama yang tidak diperlukan seperti ini.

Cukup definisikan ekspresi closure sederhana sebagai parameter. Mari kita lihat contohnya.

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
let reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in
    return s1 > s2
})

print(reversedNames)

///sorted method takes closure as parameter.

Kata Kunci in

Kata kunci in menunjukkan bahwa isi closure dimulai.

Sebelum menuliskan kata kunci in, parameter yang diterima closure dan jenis nilai kembaliannya harus ditentukan.

Menentukan Jenis dari Konteks

Menentukan Jenis dari Konteks

Pada contoh di atas, ekspresi closure dapat dipahami dengan menyimpulkan parameter dan jenis nilai kembalian, karena metode sorted menerima closure.

Oleh karena itu, kita tidak perlu menentukannya secara terpisah.

Pada contoh ini, dapat dipahami bahwa karena nilai dalam larik names merupakan teks, parameter yang diterima closure akan berjenis teks.

Demikian pula, closure terkait memerlukan jenis Boolean untuk melakukan pengurutan, sehingga jenis nilai kembaliannya akan disimpulkan sebagai Boolean.

Contoh

Hal ini akan menyederhanakan penggunaan berikut.

Tanda panah juga dapat dihilangkan dari kode dengan menyimpulkan jenis nilai kembalian.

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
let reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in
    return s1 > s2
})

print(reversedNames)

Sintaks Singkat

Penggunaan sintaks panjang, bukan sintaks singkat, lebih disarankan agar tidak membingungkan pembaca kode.

Sintaks di atas masih dapat dibuat lebih singkat.

Nilai kembalian dapat dipersingkat dengan ekspresi closure dengan menghapus kata kunci return.

/*
In this example, the return keyword has been extracted.
It already has single expression. 
There is no need to express it as an extra with return.
*/

var names = ["Coddy", "Kit"]
let reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } )
print(reversedNames)

Contoh

Pada contoh ini, kata kunci return telah dihilangkan.

Sudah terdapat satu ekspresi, sehingga tidak perlu menyatakannya lagi dengan return.

reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } )

Singkatan Nama

Sintaks ini masih dapat dibuat lebih singkat. Pada contoh di atas, kita menyatakan bahwa closure menerima dua parameter, termasuk s1 dan s2. Jenis keduanya disimpulkan.

Sekarang kita dapat menghindari penulisan parameter tersebut secara lengkap dengan menggunakan singkatan.

Selain itu, karena tidak ada definisi parameter dan penerusan nilai kembalian, kata kunci in juga dapat dihilangkan.

let names = ["Coddy", "Kit"]
let reversedNames = names.sorted(by: { $0 > $1 } )
print(reversedNames)

// In this example $0 will shortcut the first parameter and $1 will shortcut the second parameter.

Menyingkat Contoh

var names = ["Coddy", "Kit"]

let reversedNames = names.sorted(by: >)
print(reversedNames)
// Greater than operator takes two parameters and the rotation type is squat.

TRAILING CLOSURE

Blok Kode di Akhir

Jika parameter yang diteruskan ke fungsi closure merupakan argumen terakhir fungsi dan ekspresi closure tersebut panjang, menuliskannya sebagai pernyataan trailing closure mungkin akan lebih praktis.

Kita dapat menggunakan trailing closure sebagai gula sintaksis. Sintaks ini digunakan untuk meningkatkan keterbacaan kode.

Parameter terakhir dari sebagian besar metode iOS adalah closure.

Parameter Terakhir

Misalnya, pada contoh ini, parameter terakhirnya adalah closure.

class Animator {
    class func animate(withDuration duration: Double, animations: () -> Void) {
        animations()
    }
}

class MyViewController {
    func start() {
        // With the traditional method, we can call this fund as follows.
        Animator.animate(withDuration: 1, animations: { [unowned self] in
            print("red")
        })
    }
}
MyViewController().start()

Menulis Kode agar Lebih Mudah Dibaca

Karena kode di atas kurang mudah dibaca, kode tersebut dapat ditulis seperti berikut.

import Foundation
Thread.sleep(forTimeInterval: 1)
print("Background color changed to red")

Contoh

Saat menggunakan sintaks trailing closure, kita tidak perlu menulis label argumen.

Hal ini karena closure kini telah menjadi bagian dari pemanggilan fungsi.

func someFunctionThatTakesAClosure(closure: () -> Void) {
    // function body goes here
}

// Here's how you call this function without using a trailing closure:
someFunctionThatTakesAClosure(closure: {
    // closure's body goes here
})

// Here's how you call this function with a trailing closure instead:
someFunctionThatTakesAClosure() {
    // trailing closure's body goes here
}

Sintaks

Kita dapat menganggap sintaks trailing closure sebagai gula sintaksis. Sintaks ini membuat kode lebih mudah dibaca.

/*
In the example below, animations
are expressed as closure.
*/
public class func animate(withDuration: TimeInterval, animations: () -> Void)

// In traditional usage, we need to make a call like the following.
UIView.animate(withDuration: 1, animations: { [unowned self] in
    self.view.backgroundColor = UIColor.red
})

/*
In this way, both the readability of the code
increases and we avoid the use of extra brackets.
If it is as above and the last parameter of the method 
is closure, Swift allows to make a call like the one below.
*/

UIView.animate(withDuration: 1) { [unowned self] in
    self.view.backgroundColor = UIColor.red
}

Menggunakan Kode Berikut untuk Menguji Kode

Kita dapat menggunakan kode di bawah untuk menguji kode.


func greetThenRunClosure(name: String, closure: () -> ()) {
    print("Hello, \(name)!")
    closure()
}

greetThenRunClosure(name: "Paul") {
    print("The closure was run")
}

Menangkap Nilai dalam Closure

Menangkap Nilai dalam Closure

Closure dapat menyimpan nilai variabel yang berada di lingkungan sekitarnya. Anda bahkan dapat mengubah nilai variabel tersebut dari dalam isi closure dan mengaksesnya.

Meskipun variabel tersebut tidak lagi berada dalam lingkup asli tempat variabel itu didefinisikan.

Lanjutan

Secara umum, fungsi bersarang dan ekspresi closure dapat menyimpan data ini. Keduanya dapat menyimpan data dari fungsi luar.

func makeIncrementer(forIncrement amount: Int) -> () -> Int {
    var runningTotal = 0
    func incrementer() -> Int {
        runningTotal += amount
        return runningTotal
    }
    return incrementer
}

let incrementByTen = makeIncrementer(forIncrement: 10)

print(incrementByTen())
// returns a value of 10
print(incrementByTen())
// returns a value of 20
print(incrementByTen())
// returns a value of 30

Lanjutan

Jika Anda menetapkan closure sebagai properti kelas, closure tersebut akan mulai menyimpan referensi kuat ke instans ini.

Oleh karena itu, siklus referensi kuat akan terbentuk antara closure dan instans.

Perhatian khusus harus diberikan untuk mencegah kebocoran memori.

Peringatan

Closure dan fungsi adalah tipe referensi.

@escaping

Kita mungkin memerlukan penggunaan ini di berbagai tempat yang menggunakan closure secara asinkron.

Pada versi awal Swift (1 dan 2), closure dalam parameter Swift bersifat escaping dan kemudian menjadi non-escaping. Jika kita perlu meneruskan closure sebagai non-escaping, kita harus menentukannya secara khusus.

Pada versi berikutnya, parameter closure dibuat menjadi non-escaping untuk menghemat penggunaan memori.

Sekarang, jika kita ingin menentukan closure sebagai escaping, kita harus menggunakan kata kunci @escaping.

@ESCAPING Kata Kunci

@ESCAPING Kata Kunci

Jika kita ingin dapat memanggil closure yang ditetapkan ke suatu fungsi setelah fungsi tersebut selesai, kita perlu menandainya dengan kata kunci @escaping.

Closure yang secara bawaan ditetapkan sebagai parameter fungsi merupakan tipe referensi, tetapi tidak menambah jumlah referensi. Karena setelah dipanggil, masa hidup closure tersebut berakhir, kita tidak perlu menambah jumlah referensinya.

Namun, jika kita masih memerlukan closure sebagai parameter setelah fungsi dipanggil, kita mungkin perlu menandainya dengan kata kunci @escaping.

nonEscaping

Pertama, mari kita lihat cara kerja closure nonEscaping.

Saat closure ini diteruskan sebagai parameter ke fungsi, closure diproses di dalam isi fungsi lalu dikembalikan ke kompilator.

Setelah fungsi selesai, yaitu setelah eksekusi selesai, closure tersebut tidak lagi berada dalam lingkupnya dan dikembalikan ke memori.

Menggunakan Closure Escaping

Menggunakan Closure Escaping

Saat fungsi closure diteruskan sebagai argumen, closure tersebut tetap dipertahankan meskipun fungsi closure selesai dan eksekusi telah berakhir.

Closure tersebut tetap menggunakan ruang memori sampai dieksekusi. Ada beberapa jenis closure escaping.

Selamat

Selamat 🎉

Kita telah sampai di akhir pelajaran. 

Sampai jumpa di pelajaran berikutnya 😎

Closure — ilustrasi 29

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Closure” gratis?

Ya — teks lengkap “Closure” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Swift Academy, upgrade ke CoddyKit PRO. Kursus Swift Academy mencakup 1 pelajaran total.

Apa yang akan aku pelajari di “Closure”?

Closure Kamu berlatih Swift Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Swift Academy?

Tidak diperlukan pengalaman sebelumnya. Swift Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 1.

Berapa lama pelajaran “Closure” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Swift Academy ini?

Ya. Setiap pelajaran Swift Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

← Kembali ke Swift Academy