Escaping-sulkeumat
Tallenna sulkeumia, jotka elävät funktiota pidempään.
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 }) // 14Pikakysymys
Milloin sulkeumaparametri on merkittävä @escaping-attribuutilla?
Kertaus
Opitte escaping-sulkeumat:
- Non-escaping on oletus; sulkeumat suoritetaan ennen funktion palautumista
@escapingvaaditaan 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.
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
- Arvojen sieppaaminen viittauksina
- Escaping-sulkeumat
- Sieppauslistat ja weak self
- Automaattiset sulkeumat