Swift-nedläggningar
stängningar i Swift 4 liknar de för fristående funktioner organiserade som block och kallas var som helst som C-och objektiva C-språk. Konstanter och variabla referenser definierade inuti funktionerna fångas och lagras i stängningar. Funktioner betraktas som speciella fall av nedläggningar och det tar följande tre former−
globala funktioner | kapslade funktioner | Stängningsuttryck |
---|---|---|
ha ett namn. Fånga inte några värden | har ett namn. Fånga värden från omslutande funktion | Namnlösa stängningar fånga värden från intilliggande block |
Stängningsuttryck i Swift 4-språk följer skarpa, optimerings-och lätta syntaxstilar som inkluderar.
- härleda parameter-och returvärdestyper från sammanhang.
- Implicit returnerar från stängningar med enstaka uttryck.
- Shorthand argument namn och
- avslutande stängning syntax
Syntax
Följande är en generisk syntax för att definiera stängning som accepterar parametrar och returnerar en datatyp−
{ (parameters) −> return type in statements}
Följande är ett enkelt exempel−
let studname = { print("Welcome to Swift Closures") }studname()
när vi kör ovanstående program med playground får vi följande resultat−
Welcome to Swift Closures
följande stängning accepterar två parametrar och returnerar ett Bool-värde−
{ (Int, Int) −> Bool in Statement1 Statement 2 --- Statement n}
Följande är ett enkelt exempel−
let divide = { (val1: Int, val2: Int) -> Int in return val1 / val2 }let result = divide(200, 20)print (result)
när vi kör ovanstående program med playground får vi följande resultat−
10
uttryck i nedläggningar
kapslade funktioner ger ett bekvämt sätt att namnge och definiera kodblock. Istället för att representera hela funktionsdeklarationen och namnkonstruktioner används för att beteckna kortare funktioner. Att representera funktionen i ett tydligt kort uttalande med fokuserad syntax uppnås genom stängningsuttryck.
stigande Ordningsprogram
sortering en sträng uppnås med Swift 4S-nyckelreserverad funktion ”sorterad” som redan finns i standardbiblioteket. Funktionen sorterar de givna strängarna i stigande ordning och returnerar elementen i en ny array med samma storlek och datatyp som nämns i den gamla arrayen. Den gamla matrisen förblir densamma.
två argument representeras i den sorterade funktionen−
-
värden av känd typ representerad som arrays.
-
Array contents (Int, Int) och returnerar ett booleskt värde (Bool) om arrayen sorteras ordentligt kommer det att returnera sant värde annars kommer det att returnera falskt.
en normal funktion med inmatningssträng skrivs och skickas till den sorterade funktionen för att få strängarna sorterade till ny array som visas nedan−
func ascend(s1: String, s2: String) -> Bool { return s1 > s2}let stringcmp = ascend(s1: "Swift 4", s2: "great")print (stringcmp)
när vi kör över programmet med playground får vi följande resultat−
true
den ursprungliga arrayen som ska sorteras för Glass ges som ”Swift 4″och ” great”. Funktion för att sortera arrayen deklareras som strängdatatyp och dess returtyp nämns som Boolesk. Båda strängarna jämförs och sorteras i stigande ordning och lagras i en ny array. Om sorteringen utförs framgångsrikt returnerar funktionen ett sant värde annars kommer det att returnera falskt.
stängning uttryck syntax använder−
- konstanta parametrar,
- variabla parametrar och
- inout-parametrar.
stängningsuttryck stödde inte standardvärden. Variadiska parametrar och Tupler kan också användas som parametertyper och returtyper.
let sum = { (no1: Int, no2: Int) -> Int in return no1 + no2 }let digits = sum(10, 20)print(digits)
när vi kör ovanstående program med playground får vi följande resultat−
30
parametrarna och returtypdeklarationerna som nämns i funktionsuttalandet kan också representeras av funktionen inline closure expression med ’in’ – nyckelordet. När deklarera parameter och returtyper ’i’ sökord används för att beteckna att kroppen av stängningen.
enkelt uttryck Implicit returnerar
här gör funktionstypen för den sorterade funktionens andra argument det klart att ett Bool-värde måste returneras av stängningen. Eftersom stängningens kropp innehåller ett enda uttryck (s1 > s2) som returnerar ett Bool-värde, finns det ingen tvetydighet och returnyckelordet kan utelämnas.
för att returnera en enda uttryckssats i uttrycksavslutningar ’return’ – nyckelordet utelämnas i dess deklarationsdel.
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)
när vi kör ovanstående program med playground får vi följande resultat−
uttalandet i sig definierar tydligt att när string1 är större än sträng 2 retur sant annars falskt därmed retur uttalande utelämnas här.
kända Typstängningar
Tänk på tillägget av två siffror. Vi vet att tillägget kommer att returnera heltalsdatatypen. Därför deklareras kända typstängningar som−
let sub = { (no1: Int, no2: Int) -> Int in return no1 - no2 }let digits = sub(10, 20)print(digits)
när vi kör ovanstående program med playground får vi följande resultat−
-10
att förklara Shorthand Argumentnamn som stängningar
Swift 4 ger automatiskt shorthand argumentnamn till inline-stängningar, som kan användas för att hänvisa till värdena för stängningens argument med namnen $0, $1, $2 och så vidare.
var shorthand: (String, String) -> Stringshorthand = { }print(shorthand("100", "200"))
här hänvisar $0 och $1 till stängningens första och andra Strängargument.
när vi kör ovanstående program med playground får vi följande resultat−
200
Swift 4 underlättar för användaren att representera inline nedläggningar som stenografi argument namn genom att representera $0, $1, $2 — $n.
stängningsargumentlistan utelämnas i definitionsavsnittet när vi representerar stenografi argumentnamn inuti stängningsuttryck. Baserat på funktionstypen kommer shorthand-argumentnamnen att härledas. Eftersom stenograferingsargumentet definieras i uttryckskroppen utelämnas nyckelordet ’in’.
stängningar som Operatörsfunktioner
Swift 4 ger ett enkelt sätt att komma åt medlemmarna genom att bara tillhandahålla operatörsfunktioner som stängningar. I de tidigare exemplen används nyckelordet ’ Bool ’för att returnera antingen’ true ’när strängarna är lika annars returnerar det’false’.
uttrycket görs ännu enklare av operatörsfunktionen i stängning som−
let numb = var sortedNumbers = numb.sorted ({ (left: Int, right: Int) -> Bool in return left < right})let asc = numb.sorted(<)print(asc)
när vi kör ovanstående program med playground får vi följande resultat−
stängningar som släpvagnar
som överför funktionens slutliga argument till ett stängningsuttryck deklareras med hjälp av ’avslutande stängningar’. Det är skrivet utanför funktionen () med {}. Dess användning behövs när det inte går att skriva funktionen inline på en enda rad.
reversed = sorted(names) { > }
där {$0 > $1} representeras som avslutande stängningar deklarerade utanför (namn).
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)
när vi kör ovanstående program med playground får vi följande resultat−
fånga värden och referenstyper
i Swift 4, fånga konstanter och variabler värden görs med hjälp av nedläggningar. Det hänvisar vidare till och ändrar värdena för dessa konstanter och variabler inuti stängningskroppen även om variablerna inte längre existerar.
fånga konstanta och variabla värden uppnås genom att använda kapslad funktion genom att skriva funktion med i kroppen av annan funktion.
en kapslad funktion fångar−
- yttre Funktionsargument.
- fånga konstanter och variabler definierade inom den yttre funktionen.
i Swift 4, när en konstant eller en variabel deklareras inuti en funktion, skapas också hänvisning till dessa variabler automatiskt av stängningen. Det ger också möjlighet att hänvisa mer än två variabler som samma stängning enligt följande−
let decrem = calcDecrement(forDecrement: 18)decrem()
här kommer oneDecrement-och Decrement-variabler båda att peka på samma minnesblock som stängningsreferens.
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()
när vi kör ovanstående program med playground får vi följande resultat−
826446
när varje gång den yttre funktionen calcDecrement kallas anropar den funktionen decrementer () och minskar värdet med 18 och returnerar resultatet med hjälp av yttre funktion calcDecrement. Här fungerar calcDecrement som en stängning.
även om funktionen decrementer() inte har några argument stängning som standard hänvisar till variablerna ’overallDecrement’ och ’total’ genom att fånga sina befintliga värden. Kopian av värdena för de angivna variablerna lagras med den nya funktionen decrementer (). Swift 4 hanterar minneshanteringsfunktioner genom att allokera och avallokera minnesutrymmen när variablerna inte används.