0Pricing
Swift Academy · Pelajaran

Closure yang Lolos

Simpan closure yang masa hidupnya melampaui fungsinya.

Closure yang Lolos adalah pelajaran Swift Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. 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 4 pelajaran total.

Closure yang Keluar vs Tidak Keluar

Secara default, parameter closure tidak keluar: closure tersebut harus dipanggil sebelum fungsi selesai. Tandai dengan @escaping jika closure mungkin disimpan dan dipanggil kemudian.

Closure yang Tidak Keluar

Closure ini berjalan secara sinkron dan sudah tidak ada ketika fungsi selesai:

func run(_ work: () -> Void) {
    work()
}
run { print("done now") }  // "done now"

Mengapa @escaping Diperlukan

Menyimpan closure untuk digunakan nanti memerlukan @escaping:

var handlers: [() -> Void] = []
func register(_ handler: @escaping () -> Void) {
    handlers.append(handler)  // escapes the function
}
register { print("later") }
handlers[0]()  // "later"

Closure yang Keluar dengan Pekerjaan Asinkron

Handlers penyelesaian keluar karena dijalankan setelah fungsi selesai:

func load(then completion: @escaping (String) -> Void) {
    // imagine async work
    completion("data")
}
load { result in print(result) }  // "data"

self Harus Ditulis Secara Eksplisit

Di dalam closure yang keluar, Anda harus menulis self. secara eksplisit saat mengakses anggota instance — sebagai pengingat bahwa closure tersebut mungkin mempertahankan self.

self Eksplisit dalam Closure yang Keluar

Kompilator mengharuskan referensi eksplisit tersebut:

class Loader {
    var name = "L"
    func start(_ done: @escaping () -> Void) {
        let cb = { print(self.name); done() }
        cb()
    }
}
Loader().start { print("finished") }  // "L" then "finished"

Menyimpan Banyak Fungsi Panggilan Balik

Closures yang keluar memungkinkan Anda membuat daftar pengamat:

class Emitter {
    private var listeners: [(Int) -> Void] = []
    func on(_ l: @escaping (Int) -> Void) { listeners.append(l) }
    func fire(_ v: Int) { listeners.forEach { $0(v) } }
}
let e = Emitter()
e.on { print("got \($0)") }
e.fire(7)  // "got 7"

Mengembalikan Closure yang Disimpan

Closure yang disimpan dalam properti bersifat keluar:

class Button {
    var action: (() -> Void)?
    func setAction(_ a: @escaping () -> Void) { action = a }
}
let b = Button()
b.setAction { print("tapped") }
b.action?()  // "tapped"

Closure Opsional Bersifat Keluar

Parameter closure opsional secara implisit bersifat keluar (dibungkus dalam Optional), sehingga dapat disimpan:

func maybe(_ f: (() -> Void)?) {
    f?()
}
maybe { print("ran") }  // "ran"

Closure yang Keluar ke Array Tugas

Antrean pekerjaan yang ditunda adalah kasus penggunaan klasik untuk closure yang keluar — setiap closure disimpan, lalu dijalankan kemudian:

var tasks: [() -> Int] = []
func schedule(_ task: @escaping () -> Int) {
    tasks.append(task)
}
schedule { 1 + 1 }
schedule { 10 * 2 }
print(tasks.map { $0() })  // [2, 20]

Catatan Kinerja

Closure yang tidak keluar dapat dioptimalkan dengan lebih agresif (tidak memerlukan alokasi heap). Pertahankan closure agar tidak keluar jika memungkinkan; jadikan closure keluar hanya ketika Anda benar-benar menyimpan atau menundanya.

func sum(_ xs: [Int], _ f: (Int) -> Int) -> Int {
    xs.reduce(0) { $0 + f($1) }   // non-escaping, fast
}
print(sum([1, 2, 3]) { $0 * $0 })  // 14

Pemeriksaan Singkat

Kapan parameter closure harus ditandai @escaping?

Ringkasan

Anda telah mempelajari closures yang keluar:

  • Tidak keluar adalah perilaku default; closures berjalan sebelum fungsi selesai
  • @escaping diperlukan untuk menyimpan atau menunda closure
  • Closures yang keluar memerlukan akses eksplisit ke self.
  • Parameter closure opsional keluar secara implisit; pilih closure yang tidak keluar untuk kecepatan

Berikutnya: daftar tangkapan dan self lemah.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Closure yang Lolos” gratis?

Ya — teks lengkap “Closure yang Lolos” 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 4 pelajaran total.

Apa yang akan aku pelajari di “Closure yang Lolos”?

Simpan closure yang masa hidupnya melampaui fungsinya. 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 2 dari 4.

Berapa lama pelajaran “Closure yang Lolos” 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.

Semua pelajaran dalam kursus ini

  1. Menangkap Nilai berdasarkan Referensi
  2. Closure yang Lolos
  3. Daftar Penangkapan dan Weak Self
  4. Autoclosure
← Kembali ke Swift Academy