Swift-Closures

hirdetések

a Swift 4-ben a bezárások hasonlóak a blokkként szervezett önálló funkciókhoz, és bárhol meghívhatók, mint például a C és az Objective C nyelvek. A függvényeken belül definiált konstansok és változó referenciák rögzítésre és tárolásra kerülnek. A funkciók a bezárások különleges eseteinek tekinthetők, és a következő három formát öltik−

globális függvények beágyazott függvények bezárási kifejezések
mondj egy nevet. Ne rögzítsen semmilyen értéket van neve. Capture értékeket körülzáró függvény névtelen lezárások capture értékeket a szomszédos blokkok

Bezárás kifejezések Swift 4 nyelven kövesse éles, optimalizálás, és könnyű szintaxis stílusok, amely magában foglalja.

  • paraméter és visszatérési érték típusok következtetése a kontextusból.
  • Implicit visszatér az egy kifejezésű lezárásokból.
  • gyorsírási argumentumnevek és
  • záró zárási szintaxis

szintaxis

a következő egy általános szintaxis a zárás meghatározásához, amely elfogadja a paramétereket és visszaad egy adattípust−

{ (parameters) −> return type in statements}

a következő egy egyszerű példa−

let studname = { print("Welcome to Swift Closures") }studname()

amikor a fenti programot játszótérrel futtatjuk, a következő eredményt kapjuk−

Welcome to Swift Closures

a következő lezárás két paramétert fogad el, és Bool értéket ad vissza−

{ (Int, Int) −> Bool in Statement1 Statement 2 --- Statement n}

a következő egy egyszerű példa−

let divide = { (val1: Int, val2: Int) -> Int in return val1 / val2 }let result = divide(200, 20)print (result)

amikor a fenti programot játszótérrel futtatjuk, megkapjuk a következő eredmény−

10

a beágyazott függvények kényelmes módot nyújtanak a kódblokkok elnevezésére és meghatározására. A teljes függvénydeklaráció helyett a név konstrukciókat használjuk a rövidebb függvények jelölésére. A függvény világos rövid nyilatkozatban történő ábrázolása fókuszált szintaxissal zárási kifejezésekkel érhető el.

növekvő sorrendű Program

a karakterlánc rendezése A Swift 4S kulcs által fenntartott “rendezett” funkcióval érhető el, amely már elérhető a standard könyvtárban. A függvény növekvő sorrendben rendezi az adott karakterláncokat, és visszaadja az elemeket egy új tömbben, ugyanolyan méretű és adattípusú, mint a régi tömbben. A régi tömb ugyanaz marad.

két argumentum jelenik meg a rendezett függvényen belül−

  • az ismert típusú értékek tömbként vannak ábrázolva.

  • Array contents (Int, Int) és Boolean értéket ad vissza (Bool), ha a tömb megfelelően van rendezve, akkor true értéket ad vissza, különben false értéket ad vissza.

a normál függvény input string van írva, majd át a rendezett függvény, hogy a húrok rendezve új tömb, amely az alább látható−

func ascend(s1: String, s2: String) -> Bool { return s1 > s2}let stringcmp = ascend(s1: "Swift 4", s2: "great")print (stringcmp)

amikor a playground segítségével futtatjuk a programot, a következő eredményt kapjuk−

true

a jégkrémhez rendezendő kezdeti tömb a “Swift 4” és a “great”. A tömb rendezésére szolgáló függvény string adattípusként van deklarálva,visszatérési típusa pedig logikai. Mindkét karakterláncot összehasonlítjuk és növekvő sorrendben rendezzük, majd egy új tömbben tároljuk. Ha a rendezés sikeres, a függvény valódi értéket ad vissza, máskülönben hamis értéket ad vissza.

záró kifejezés szintaxis használ−

  • állandó paraméterek,
  • változó paraméterek és
  • inout paraméterek.

a bezárási kifejezés nem támogatja az alapértelmezett értékeket. A variadikus paraméterek és sorozatok paramétertípusként és visszatérési típusként is használhatók.

let sum = { (no1: Int, no2: Int) -> Int in return no1 + no2 }let digits = sum(10, 20)print(digits)

amikor a fenti programot a playground segítségével futtatjuk, a következő eredményt kapjuk−

30

a függvény utasításban említett paraméterek és visszatérési típus deklarációk az ‘in’ kulcsszóval ellátott inline closure expression függvényrel is ábrázolhatók. Miután deklaráló paraméter és visszatérési típusok ‘ in ‘ kulcsszó jelöli, hogy a test a lezárás.

egyetlen kifejezés Implicit értéke

itt a rendezett függvény második Argumentumának függvénytípusa egyértelművé teszi, hogy a bool értéket vissza kell adni a bezárásnak. Mivel a Bezárás törzse egyetlen kifejezést tartalmaz (s1 > s2), amely Bool értéket ad vissza, nincs kétértelműség, és a return kulcsszó elhagyható.

egyetlen kifejezésutasítás visszaadásához a kifejezés bezárásakor a ‘return’ kulcsszó elhagyásra kerül a deklaráció részében.

var count: = let descending = count.sorted(by: { n1, n2 in n1 > n2 })let ascending = count.sorted(by: { n1, n2 in n1 < n2 })print(descending)print(ascending)

amikor a fenti programot a playground segítségével futtatjuk, a következő eredményt kapjuk−


maga az állítás egyértelműen meghatározza, hogy ha a string1 nagyobb, mint a string 2 visszatér igaz egyébként hamis, ezért a return utasítás itt elhagyható.

ismert típusú lezárások

fontolja meg két szám hozzáadását. Tudjuk, hogy az összeadás visszaadja az egész adattípust. Ezért az ismert típusú lezárásokat a következőképpen deklarálják−

let sub = { (no1: Int, no2: Int) -> Int in return no1 - no2 }let digits = sub(10, 20)print(digits)

amikor a fenti programot játszótérrel futtatjuk, a következő eredményt kapjuk−

-10

a Gyorsírási argumentumok nevének lezárásként való deklarálása

a Swift 4 automatikusan megadja a gyorsírási argumentumok nevét az inline lezárásokhoz, amelyek felhasználhatók a lezárás argumentumainak értékeire a $0, $1, $2 stb.

var shorthand: (String, String) -> Stringshorthand = {  }print(shorthand("100", "200"))

itt a $0 és $1 A lezárás első és második karakterlánc argumentumaira utal.

amikor a fenti programot a playground segítségével futtatjuk, a következő eredményt kapjuk−

200

a Swift 4 megkönnyíti a felhasználó számára, hogy az Inline bezárásokat rövid argumentumnevekként ábrázolja $0, $1, $2 — $n.

lezárások argumentumlista kihagyásra kerül a definíció szakaszban, amikor rövid argumentumneveket ábrázolunk a bezárási kifejezésekben. A függvény típusa alapján a gyorsírási argumentumnevek származtatásra kerülnek. Mivel a gyorsírási argumentum a kifejezéstestben van definiálva ,az’ in ‘ kulcsszó kihagyásra kerül.

bezárások mint operátori funkciók

a Swift 4 egyszerű módot kínál a tagok elérésére azáltal, hogy csak operátori funkciókat biztosít bezárásként. Az előző példákban a ‘Bool’ kulcsszót használjuk a ‘true’ visszatérésére, ha a karakterláncok egyenlőek, különben a ‘false’értéket adja vissza.

a kifejezést még egyszerűbbé teszi operátor funkció Bezárás mint−

let numb = var sortedNumbers = numb.sorted ({ (left: Int, right: Int) -> Bool in return left < right})let asc = numb.sorted(<)print(asc)

amikor a fenti programot játszótérrel futtatjuk, a következő eredményt kapjuk−


lezárások mint pótkocsik

a függvény végső Argumentumának átadását egy záró kifejezésnek a ‘záró lezárások’segítségével deklaráljuk. A függvényen kívül van írva () val vel {}. Használata akkor szükséges, ha a függvény inline-t nem lehet egyetlen sorra írni.

reversed = sorted(names) {  > }

ahol {$0 > $1} külső záró lezárásként (nevekként) vannak ábrázolva.

import Foundationvar letters = let twoletters = letters.map({ (state: String) -> String in return state.substringToIndex(advance(state.startIndex, 2)).uppercaseString})let stletters = letters.map() { .substringToIndex(advance(.startIndex, 2)).uppercaseString }print(stletters)

amikor a fenti programot a playground segítségével futtatjuk, a következő eredményt kapjuk−


értékek és Referenciatípusok rögzítése

a Swift 4-ben az állandók és változók értékeinek rögzítése lezárások segítségével történik. Továbbá utal és módosítja a zárótesten belüli állandók és változók értékeit, annak ellenére, hogy a változók már nem léteznek.

az állandó és változó értékek rögzítése a beágyazott függvény használatával érhető el, ha a függvényt más függvény testébe írja.

egy beágyazott függvény rögzíti−

  • külső függvény argumentumok.
  • a külső függvényben definiált állandók és változók rögzítése.

a Swift 4-ben, amikor egy konstansot vagy változót deklarálnak egy függvényen belül, az adott változókra való hivatkozás is automatikusan létrejön a bezárással. Azt is lehetővé teszi, hogy több mint két változót azonos lezárásként hivatkozzon az alábbiak szerint−

let decrem = calcDecrement(forDecrement: 18)decrem()

itt a oneDecrement és a Decrement változók ugyanazt a memóriablokkot mutatják, mint a bezárási referencia.

func calcDecrement(forDecrement total: Int) -> () -> Int { var overallDecrement = 100 func decrementer() -> Int { overallDecrement -= total print(overallDecrement) return overallDecrement } return decrementer}let decrem = calcDecrement(forDecrement: 18)decrem()decrem()decrem()

amikor a fenti programot a playground segítségével futtatjuk, a következő eredményt kapjuk−

826446

amikor minden egyes alkalommal a külső függvény calcDecrement nevezzük meghívja a decrementer () függvény és csökkenti az értéket 18 és visszaadja az eredményt segítségével külső függvény calcDecrement. Itt a meszesedés zárásként működik.

annak ellenére, hogy a decrementer() függvénynek nincs argumentuma, a closure alapértelmezés szerint az ‘overallDecrement’ és a ‘total’ változókra utal a meglévő értékeinek rögzítésével. A megadott változók értékeinek másolatát az új decrementer() függvény tárolja. A Swift 4 kezeli a memóriakezelési funkciókat a memóriaterületek kiosztásával és elosztásával, amikor a változók nincsenek használatban.

reklámok