let sortedNumbers = numbers.sort { $0 > $1 }
print(sortedNumbers)
Quelqu'un peut-il expliquer, quel $0
et $1
signifie en bref?
Plus échantillon
array.forEach {
actions.append($0)
}
$0
est le premier paramètre passé dans la fermeture. $1
est le deuxième paramètre, etc. Cette fermeture que vous avez montrée est un raccourci pour:
let sortedNumbers = numbers.sort { (firstObject, secondObject) in
return firstObject > secondObject
}
Il représente les arguments en raccourci envoyés dans une clôture, cet exemple le décompose:
Swift 4:
var add = { (arg1: Int, arg2: Int) -> Int in
return arg1 + arg2
}
add = { (arg1, arg2) -> Int in
return arg1 + arg2
}
add = { arg1, arg2 in
arg1 + arg2
}
add = {
$0 + $1
}
let result = add(20, 20) // 40
Dans votre exemple
$0
et$1
_ sont les arguments de Closure , premier et second String dans unShorthand Argument Names
_ . Les noms d’arguments abrégés sont automatiquement fournis par Swift. Le premier argument peut être référencé par$0
, le deuxième argument peut être référencé par$1
, le troisième par$2
, et ainsi de suite.
Comme vous le savez, un fermeture est très proche d'un Fonction -Lambda, ou un Petite fonction anonyme , est un bloc de fonctionnalités autonome qui peut être transmis et utilisé dans votre code. La fermeture a des noms différents dans les autres langages de programmation, ainsi que de légères différences de sens - c’est Lambda dans Python et Kotlin ou Bloquer dans [~ # ~] c [~ # ~] et Objective-C .
PREMIER EXEMPLE :
let coffee: [String] = ["Cappuccino", "Espresso", "Latte", "Ristretto"]
func backward(_ n1: String, _ n2: String) -> Bool {
return n1 > n2
}
var reverseOrder = coffee.sorted(by: backward)
/* RESULT: ["Ristretto", "Latte", "Espresso", "Cappuccino"] */
reverseOrder = coffee.sorted(by: { (n1: String, n2: String) -> Bool in
return n1 > n2
})
reverseOrder = coffee.sorted(by: { (n1: String, n2: String) -> Bool in return n1 > n2 } )
reverseOrder = coffee.sorted(by: { n1, n2 in return n1 > n2 } )
reverseOrder = coffee.sorted(by: { n1, n2 in n1 > n2 } )
reverseOrder = coffee.sorted(by: { $0 > $1 } )
/* $0 and $1 are closure’s first and second String arguments. */
reverseOrder = coffee.sorted(by: >)
/* RESULT: ["Ristretto", "Latte", "Espresso", "Cappuccino"] */
SECOND EXEMPLE :
let companies = ["bmw", "kfc", "ibm", "htc"]
let uppercasedCompanies = companies.map { (item) -> String in
item.uppercased()
}
/* RESULT: ["BMW", "KFC", "IBM", "HTC"] */
let uppercasedCompanies = companies.map {
$0.uppercased()
}
/* RESULT: ["BMW", "KFC", "IBM", "HTC"] */
TROISIÈME EXEMPLE :
let numbers: [Int] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let filteredNumbers = numbers.filter { ($0 % 2) == 0 }
print(filteredNumbers)
/* RESULT: [2, 4, 6, 8, 10] */
J'espère que cela t'aides.
Les renvoient aux premier et deuxième arguments de tri. Ici, sort
compare 2 éléments et les commande. Vous pouvez rechercher documentation officielle Swift pour plus d'informations:
Swift fournit automatiquement des noms d’arguments abrégés aux fermetures en ligne, ce qui permet de faire référence aux valeurs des arguments de la fermeture par les noms $ 0, $ 1, $ 2, etc.
Ce sont des noms d'arguments abrégés.
Swift fournit automatiquement des noms d’arguments abrégés aux fermetures en ligne, ce qui permet de faire référence aux valeurs des arguments de la fermeture par les noms $ 0, $ 1, $ 2, etc.
Si vous utilisez ces noms d’arguments abrégés dans votre expression de fermeture, vous pouvez omettre de la définition la liste des arguments de fermeture, et le nombre et le type des noms d’arguments abrégés seront déduits du type de fonction attendu. Le mot clé in peut également être omis, car l'expression de fermeture est entièrement composée de son corps:
reversed = names.sort( { $0 > $1 } )
Ici, $ 0 et $ 1 font référence aux premier et deuxième arguments de la fermeture.
En plus de @ Bobby's Answer, j'aimerais ajouter un exemple
var add: (Int,Int,Int)->Int
add = {
//So here the $0 is first argument $1 is second argument $3 is third argument
return $0 + $1 + $2
//The above statement can also be written as $0 + $1 + $2 i.e is return is optional
}
let result = add(20, 30, 40)
print(result) // Prints 90