Swift Academy · Pelajaran

defer dengan Ralat dan Pemulangan Awal

Pastikan pembersihan berlaku walaupun kod melontar ralat atau pulang awal.

Pelajaran 4 daripada 413 langkah

defer dengan Ralat dan Pemulangan Awal ialah pelajaran Swift Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Swift Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Swift Academy merangkumi sejumlah 4 pelajaran.

Penangguhan Dilaksanakan ketika Pemulangan

Blok defer dilaksanakan walaupun fungsi berakhir lebih awal melalui return.

func check(_ value: Int) {
    defer { print("cleanup ran") }
    if value < 0 {
        print("negative, returning early")
        return
    }
    print("value is", value)
}
check(-5)

Pembersihan pada Setiap Laluan

Tidak kira return yang mana dilaksanakan, pembersihan yang ditangguhkan dilaksanakan tepat sekali.

func classify(_ n: Int) {
    defer { print("done classifying") }
    if n == 0 { print("zero"); return }
    if n > 0 { print("positive"); return }
    print("negative")
}
classify(0)

Penangguhan Dilaksanakan ketika Lontaran

Apabila fungsi melontar, penangguhan yang telah didaftarkan masih dilaksanakan semasa skop dibuka semula.

enum MyError: Error { case bad }
func risky(_ fail: Bool) throws {
    defer { print("cleanup on the way out") }
    if fail { throw MyError.bad }
    print("no failure")
}
try? risky(true)

Menggabungkan Pemulangan dan Lontaran

Sama ada fungsi kembali secara normal atau melontar, penangguhan yang sama tetap dilaksanakan.

enum E: Error { case oops }
func op(_ flag: Bool) throws -> Int {
    defer { print("op finishing") }
    if flag { throw E.oops }
    return 42
}
let r = try? op(false)
print(r ?? -1)

Pembersihan sebelum Ralat Disebarkan

Penangguhan dilaksanakan sebelum ralat yang dilontar sampai kepada pemanggil, jadi sumber dilepaskan terlebih dahulu.

enum E: Error { case fail }
func load(_ broken: Bool) throws {
    print("open")
    defer { print("close") }
    if broken { throw E.fail }
    print("read")
}
do {
    try load(true)
} catch {
    print("caught:", error)
}

Perlindungan dengan Penangguhan

Pola biasa: peroleh sumber, tangguhkan pembersihan, kemudian gunakan guard dengan pemulangan awal yang masih mencetuskan pembersihan.

func process(_ items: [Int]) {
    print("start")
    defer { print("finished") }
    guard !items.isEmpty else {
        print("nothing to do")
        return
    }
    print("processing", items.count, "items")
}
process([])

Penangguhan dan Gelung yang Melontar

Penangguhan dalam gelung dilaksanakan pada akhir setiap lelaran, walaupun pernyataan kemudian melontar.

enum E: Error { case stop }
func loop() throws {
    for i in 1...3 {
        defer { print("end", i) }
        if i == 2 { throw E.stop }
        print("body", i)
    }
}
try? loop()

Susunan dengan Pemulangan Awal

Beberapa penangguhan masih dilaksanakan mengikut susunan LIFO apabila berlaku pemulangan awal.

func multi(_ skip: Bool) {
    defer { print("A") }
    defer { print("B") }
    if skip { return }
    print("body")
}
multi(true)

Log ketika Kegagalan

Gunakan penangguhan untuk log penyelesaian atau kegagalan secara konsisten merentasi semua laluan keluar.

enum E: Error { case bad }
func attempt(_ fail: Bool) throws {
    var success = false
    defer { print("attempt success:", success) }
    if fail { throw E.bad }
    success = true
}
try? attempt(true)

Memulihkan state ketika Lontaran

Penangguhan sangat sesuai untuk memulihkan state sementara apabila sesuatu operasi melontar.

enum E: Error { case fail }
func transaction(_ fail: Bool) throws {
    var inProgress = true
    defer { inProgress = false; print("inProgress:", inProgress) }
    if fail { throw E.fail }
    print("committed")
}
try? transaction(true)

Amalan Terbaik

Bergantunglah pada defer untuk pembersihan yang mesti bertahan merentasi pemulangan awal dan ralat yang dilontar, supaya tiada laluan keluar membocorkan sumber.

enum E: Error { case x }
func safe(_ fail: Bool) throws {
    print("acquire")
    defer { print("release") }
    if fail { throw E.x }
    print("use")
}
try? safe(true)

Semakan Pantas

Uji penangguhan dengan ralat dan pemulangan.

Ringkasan

defer dilaksanakan pada setiap penghujung skop, termasuk return awal dan ralat yang dilontar, sebelum ralat itu disebarkan. Ini menjadikannya tempat yang boleh dipercayai untuk pembersihan dan pemulihan state pada semua laluan keluar, dengan susunan LIFO dikekalkan.

func f(_ skip: Bool) {
    defer { print("cleanup") }
    if skip { return }
    print("work")
}
f(true)
Percuma untuk bermula

Pelajari Swift dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
122
Pelajaran
409

Soalan Lazim

Adakah pelajaran “defer dengan Ralat dan Pemulangan Awal” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Swift Academy, termasuk “defer dengan Ralat dan Pemulangan Awal”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Swift Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “defer dengan Ralat dan Pemulangan Awal”?

Pastikan pembersihan berlaku walaupun kod melontar ralat atau pulang awal. Anda berlatih Swift Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Swift Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Swift Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “defer dengan Ralat dan Pemulangan Awal” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Swift Academy ini?

Ya. Setiap pelajaran Swift Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Cara defer Berfungsi
  2. Susunan Beberapa Blok defer
  3. defer untuk Pembersihan Sumber
  4. defer dengan Ralat dan Pemulangan Awal
← Kembali ke Swift Academy