Swift-Closures
sluitingen in Swift 4 zijn vergelijkbaar met die van zelfstandige functies georganiseerd als blokken en genoemd overal als C en Objective C talen. Constanten en variabele referenties gedefinieerd binnen de functies worden vastgelegd en opgeslagen in sluitingen. Functies worden beschouwd als speciale gevallen van sluitingen en het neemt de volgende drie vormen aan−
globale functies | geneste functies | Afsluitingsuitdrukkingen |
---|---|---|
heb een naam. Geef geen waarden op | die een naam hebben. Capture values from enclosing function | naamloze sluitingen capture values from the aangrenzende blocks |
sluiting expressies in Swift 4 Taal volgen scherpe, optimalisatie en lichtgewicht syntaxis stijlen die omvat.
- Inferring parameter en return waarde types uit context.
- impliciete returns van single-expression sluitingen.
- Shorthand argument namen en
- Trailing sluiting syntaxis
Syntax
Volgende is een algemene syntaxis definiëren sluiting die accepteert parameters en geeft een data type−
{ (parameters) −> return type in statements}
hieronder Volgt een eenvoudig voorbeeld−
let studname = { print("Welcome to Swift Closures") }studname()
Wanneer wij het bovenstaande programma met speeltuin, krijgen we het volgende resultaat−
Welcome to Swift Closures
De volgende sluiting accepteert twee parameters en geeft een Bool waarde−
{ (Int, Int) −> Bool in Statement1 Statement 2 --- Statement n}
hieronder Volgt een eenvoudig voorbeeld−
let divide = { (val1: Int, val2: Int) -> Int in return val1 / val2 }let result = divide(200, 20)print (result)
Wanneer wij het bovenstaande programma met speeltuin, krijgen we de volgend resultaat−
10
expressies in sluitingen
geneste functies bieden een handige manier om codeblokken te benoemen en te definiëren. In plaats van het vertegenwoordigen van de hele functie declaratie en naam constructies worden gebruikt om kortere functies aan te duiden. Representeren van de functie in een duidelijke korte verklaring met gerichte syntaxis wordt bereikt door middel van sluiting uitdrukkingen.
oplopend orde programma
Sorteren een tekenreeks wordt bereikt door de Swift 4S sleutel gereserveerd functie “gesorteerd” die al beschikbaar is in de standaard bibliotheek. De functie sorteert de gegeven strings in oplopende volgorde en retourneert de elementen in een nieuwe array met dezelfde grootte en gegevenstype als vermeld in de oude array. De oude array blijft hetzelfde.
twee argumenten worden weergegeven in de gesorteerde functie−
-
waarden van bekend type weergegeven als arrays.
-
Array contents (int, int) en retourneert een Booleaanse waarde (Bool) als de array goed gesorteerd is, zal het true waarde retourneren, anders zal het false retourneren.
een normale functie met invoerstring wordt geschreven en doorgegeven aan de gesorteerde functie om de strings gesorteerd te krijgen naar een nieuwe array die hieronder wordt getoond−
func ascend(s1: String, s2: String) -> Bool { return s1 > s2}let stringcmp = ascend(s1: "Swift 4", s2: "great")print (stringcmp)
wanneer wij boven programma gebruikend speelplaats uitvoeren, krijgen wij volgend resultaat−
true
de initiële array die moet worden gesorteerd voor ijs wordt gegeven als ” Swift 4 “en”geweldig”. Functie om de array te sorteren wordt gedeclareerd als string datatype en zijn return type wordt vermeld als Boolean. Beide strings worden vergeleken en gesorteerd in oplopende volgorde en opgeslagen in een nieuwe array. Als de sortering succesvol wordt uitgevoerd, retourneert de functie een true-waarde anders wordt deze false geretourneerd.
Sluitingsuitdrukking syntaxisgebruik−
- constante parameters,
- variabele parameters, en
- in-outparameters.
Afsluitingsexpressie ondersteunt geen standaardwaarden. Variadische parameters en tupels kunnen ook worden gebruikt als parameter types en return types.
let sum = { (no1: Int, no2: Int) -> Int in return no1 + no2 }let digits = sum(10, 20)print(digits)
als we het bovenstaande programma uitvoeren met playground, krijgen we het volgende resultaat−
30
de parameters en return type declaraties genoemd in de functie statement kunnen ook worden weergegeven door de inline sluiting expressie functie met ‘in’ trefwoord. Zodra het declareren parameter en return types’ in ‘ trefwoord wordt gebruikt om aan te geven dat het lichaam van de sluiting.
enkele expressie impliciete Returns
hier maakt het functietype van het tweede argument van de gesorteerde functie duidelijk dat een Bool-waarde moet worden geretourneerd door het afsluiten. Omdat het lichaam van de afsluiting een enkele uitdrukking bevat (s1 > s2) die een Bool-waarde retourneert, is er geen dubbelzinnigheid en kan het sleutelwoord worden weggelaten.
om een enkele uitdrukking statement in expressie sluitingen ‘return’ sleutelwoord wordt weggelaten in zijn declaratie deel.
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)
wanneer we het bovenstaande programma uitvoeren met behulp van playground, krijgen we het volgende resultaat−
het statement zelf definieert duidelijk dat wanneer string1 groter is dan string 2 return true anders false vandaar wordt return statement hier weggelaten.
bekende sluitingen
beschouw de optelling van twee getallen. We weten dat optelling het integer datatype retourneert. Vandaar bekende type sluitingen worden verklaard als−
let sub = { (no1: Int, no2: Int) -> Int in return no1 - no2 }let digits = sub(10, 20)print(digits)
wanneer we het bovenstaande programma uitvoeren met behulp van playground, krijgen we het volgende resultaat−
-10
het declareren van Steno-Argumentnamen als sluitingen
Swift 4 levert automatisch steno-argumentnamen aan inline sluitingen, die kunnen worden gebruikt om te verwijzen naar de waarden van de argumenten van de sluiting met de namen $0, $1, $2, enzovoort.
var shorthand: (String, String) -> Stringshorthand = { }print(shorthand("100", "200"))
hier verwijzen $0 en $1 naar de eerste en tweede Tekenreeksargumenten van de afsluiting.
als we het bovenstaande programma uitvoeren met playground, krijgen we het volgende resultaat−
200
Swift 4 vergemakkelijkt de gebruiker om Inline sluitingen te vertegenwoordigen als steno argument Namen door te vertegenwoordigen $0, $1, $2 — $n.
sluitingsargumentenlijst wordt weggelaten in definitiesectie wanneer we steno-argumentnamen vertegenwoordigen binnen sluitingsuitdrukkingen. Op basis van het functietype zullen de namen van het steno-argument worden afgeleid. Omdat het steno-argument is gedefinieerd in het expressielichaam wordt het’ in ‘ sleutelwoord weggelaten.
sluitingen als Operatorfuncties
Swift 4 biedt een gemakkelijke manier om toegang te krijgen tot de leden door alleen operatorfuncties als sluitingen aan te bieden. In de vorige voorbeelden wordt het trefwoord ‘Bool’ gebruikt om ofwel ’true’ terug te geven als de strings gelijk zijn, anders geeft het ‘false’terug.
De uitdrukking wordt nog eenvoudiger met de operator functie-in sluiting−
let numb = var sortedNumbers = numb.sorted ({ (left: Int, right: Int) -> Bool in return left < right})let asc = numb.sorted(<)print(asc)
Wanneer wij het bovenstaande programma met speeltuin, krijgen we het volgende resultaat−
Sluitingen zoals Aanhangwagens
het Passeren van de functie is het laatste argument om een sluiting expressie wordt verklaard met behulp van de ‘Trailing Sluitingen’. Het is geschreven buiten de functie () met {}. Het gebruik ervan is nodig wanneer het niet mogelijk is om de functie inline op een enkele regel te schrijven.
reversed = sorted(names) { > }
waarbij {$0 > $1} worden weergegeven als sluitingen die buiten (namen) zijn aangegeven.
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)
wanneer we het bovenstaande programma uitvoeren met behulp van playground, krijgen we het volgende resultaat−
het vastleggen van waarden en Referentietypen
in Swift 4 wordt het vastleggen van waarden voor constanten en variabelen gedaan met behulp van sluitingen. Het verwijst verder naar en wijzigt de waarden voor die constanten en variabelen binnen het sluitlichaam, ook al bestaan de variabelen niet meer.
het vastleggen van constante en variabele waarden wordt bereikt door geneste functie te gebruiken door functie met in het lichaam van andere functie te schrijven.
een geneste functie vangt−
- uiterlijke Functieargumenten.
- Capture constanten en variabelen gedefinieerd binnen de Buitenfunctie.
in Swift 4 wordt, wanneer een constante of een variabele binnen een functie wordt gedeclareerd, ook automatisch een verwijzing naar die variabelen gecreëerd door de afsluiting. Het biedt ook de mogelijkheid om meer dan twee variabelen als dezelfde sluiting als volgt te verwijzen−
let decrem = calcDecrement(forDecrement: 18)decrem()
hier zullen oneDecrement en Decrement variabelen beide hetzelfde geheugenblok als sluitingsreferentie aanwijzen.
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()
als we het bovenstaande programma uitvoeren met playground, krijgen we het volgende resultaat−
826446
wanneer elke keer dat de outer function calcDecrement wordt genoemd, roept het de functie decrementer () aan en verlaagt de waarde met 18 en geeft het resultaat terug met behulp van outer function calcDecrement. Hier werkt calcDecrement als afsluiting.
hoewel de functie decrementer () geen argumenten heeft, verwijst closure standaard naar variabelen ‘overallDecrement’ en ’total’ door de bestaande waarden vast te leggen. De kopie van de waarden voor de opgegeven variabelen wordt opgeslagen met de nieuwe functie decrementer (). Swift 4 behandelt geheugenbeheerfuncties door geheugenruimtes toe te wijzen en te dealloceren wanneer de variabelen niet in gebruik zijn.