web-dev-qa-db-fra.com

Que signifient $ 0 et $ 1 dans Swift Closures?

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)
}
52
aashish tamsya

$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
}
83
AdamPro13

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
31
Bobby

Swift 5

Dans votre exemple $0 et $1 _ sont les arguments de Closure , premier et second String dans un Shorthand 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 .

Voyons comment fonctionne la fermeture en utilisant les noms d'arguments abrégés:

PREMIER EXEMPLE :

let coffee: [String] = ["Cappuccino", "Espresso", "Latte", "Ristretto"]

1. Fonction normale

func backward(_ n1: String, _ n2: String) -> Bool {
    return n1 > n2
}
var reverseOrder = coffee.sorted(by: backward)


/* RESULT: ["Ristretto", "Latte", "Espresso", "Cappuccino"] */

2. Expression de fermeture

reverseOrder = coffee.sorted(by: { (n1: String, n2: String) -> Bool in
    return n1 > n2
})

3. Expression de fermeture en ligne

reverseOrder = coffee.sorted(by: { (n1: String, n2: String) -> Bool in return n1 > n2 } )

4. Déduire le type du contexte

reverseOrder = coffee.sorted(by: { n1, n2 in return n1 > n2 } )

5. Retours implicites des fermetures à expression unique

reverseOrder = coffee.sorted(by: { n1, n2 in n1 > n2 } )

6. Noms d'arguments abrégés

reverseOrder = coffee.sorted(by: { $0 > $1 } )

/* $0 and $1 are closure’s first and second String arguments. */

7. Méthodes d'opérateur

reverseOrder = coffee.sorted(by: >)

/* RESULT: ["Ristretto", "Latte", "Espresso", "Cappuccino"] */

enter image description here

SECOND EXEMPLE :

let companies = ["bmw", "kfc", "ibm", "htc"]

Sans nom d'argument abrégé:

let uppercasedCompanies = companies.map { (item) -> String in
    item.uppercased()
}

/* RESULT: ["BMW", "KFC", "IBM", "HTC"] */

Avec noms d'argument abrégé:

let uppercasedCompanies = companies.map {
    $0.uppercased()
}

/* RESULT: ["BMW", "KFC", "IBM", "HTC"] */

enter image description here

TROISIÈME EXEMPLE :

Le corps de cette fermeture est court et facile à comprendre:

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.

10
ARGeo

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.

5
clemkoa

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
0
BharathRao