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 }) // 14Pemeriksaan Singkat
Kapan parameter closure harus ditandai @escaping?
Ringkasan
Anda telah mempelajari closures yang keluar:
- Tidak keluar adalah perilaku default; closures berjalan sebelum fungsi selesai
@escapingdiperlukan 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.