Swift Academy · Oppitunti

Escaping-sulkeumat

Tallenna sulkeumia, jotka elävät funktiota pidempään.

Oppitunti 2/413 vaihetta

Escaping-sulkeumat on ilmainen Swift Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Swift Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Swift Academy-kurssilla on yhteensä 4 oppituntia.

Escaping ja non-escaping

Sulkeumaparametri on oletusarvoisesti non-escaping: se on kutsuttava ennen funktion palautumista. Merkitkää se @escaping-attribuutilla, jos se voidaan tallentaa ja kutsua myöhemmin.

Non-escaping-sulkeuma

Tämä sulkeuma suoritetaan synkronisesti, ja se poistuu funktion palautuessa:

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

Miksi @escaping tarvitaan

Sulkeuman tallentaminen myöhempää käyttöä varten edellyttää @escaping-attribuuttia:

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

Escaping ja asynkroninen työ

Completion handlerit ovat escaping-sulkeumia, koska ne suoritetaan funktion palautumisen jälkeen:

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

self on kirjoitettava eksplisiittisesti

Escaping-sulkeuman sisällä instanssin jäseniin käsiksi pääsemiseksi on kirjoitettava self. eksplisiittisesti — tämä muistuttaa, että sulkeuma saattaa pitää self-olion elossa.

Eksplisiittinen self escaping-sulkeumassa

Kääntäjä edellyttää eksplisiittistä viittausta:

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

Useiden callback-funktioiden tallentaminen

Escaping-sulkeumien avulla voitte rakentaa tarkkailijalistoja:

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"

Tallennetun sulkeuman palauttaminen

Ominaisuuksiin tallennetut sulkeumat ovat escaping-sulkeumia:

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

Valinnaiset sulkeumat ovat escaping-sulkeumia

Valinnainen sulkeumaparametri on implisiittisesti escaping (se kääritään Optional-tyyppiin), joten sen voi tallentaa:

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

Escaping tehtävätaulukossa

Myöhemmin suoritettavan työn jono on klassinen escaping-käyttötapaus — kukin sulkeuma tallennetaan ja suoritetaan sitten myöhemmin:

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

Suorituskykyä koskeva huomautus

Non-escaping-sulkeumia voidaan optimoida tehokkaammin (keokeomuistivarausta ei tarvita). Pitäkää sulkeumat non-escaping-tilassa aina, kun mahdollista; käyttäkää escaping-tilaa vain, kun todella tallennatte tai lykkäätte niiden suorittamista.

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

Pikakysymys

Milloin sulkeumaparametri on merkittävä @escaping-attribuutilla?

Kertaus

Opitte escaping-sulkeumat:

  • Non-escaping on oletus; sulkeumat suoritetaan ennen funktion palautumista
  • @escaping vaaditaan sulkeuman tallentamiseen tai suorittamisen lykkäämiseen
  • Escaping-sulkeumat edellyttävät eksplisiittistä self.-viittausta
  • Valinnaiset sulkeumaparametrit ovat implisiittisesti escaping; suosikaa nopeuden vuoksi non-escaping-tilaa

Seuraavaksi: capture-listat ja weak self.

Aloita maksutta

Opi Swift tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
122
Oppitunnit
409

Usein kysytyt kysymykset

Onko oppitunti ”Escaping-sulkeumat” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Swift Academy-oppimispolun 3 oppituntia, myös oppitunnin “Escaping-sulkeumat”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Swift Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Escaping-sulkeumat”?

Tallenna sulkeumia, jotka elävät funktiota pidempään. Harjoittelet Swift Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Swift Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Swift Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”Escaping-sulkeumat”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Swift Academy-oppitunnilla?

Kyllä. Jokainen Swift Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Arvojen sieppaaminen viittauksina
  2. Escaping-sulkeumat
  3. Sieppauslistat ja weak self
  4. Automaattiset sulkeumat
← Takaisin: Swift Academy