Utilisation de la fonction reduction () dans Swift sans second argument

Sep 13 2020

J'ai appris jusqu'à présent que la reduce()fonction de Swift est utilisée pour produire une valeur unique à partir d'éléments dérivés d'une séquence entière. Cependant, à ma connaissance, la reduce()fonction nécessite l'appel de deux arguments, le initialResultqui doit être utilisé conjointement avec le deuxième argument le nextPartialResult. Un exemple d'implémentation de la documentation Swift est ci-dessous:

let numbers = [1, 2, 3, 4]
let numberSum = numbers.reduce(0, { x, y in
    x + y
})
// numberSum == 10

Cependant, dans certaines implémentations de reduce()j'ai vu du code tel que le suivant:

let totalIncome = peopleArray.reduce(0) {(result, next) -> Double in
    return result + next.income
}

print("Total Income: \(totalIncome) Average Income: \(totalIncome/Double(peopleArray.count))")
//Result: Total Income: 450000.0 Average Income: 150000.0

Code courtoisie de codeburst

Je ne sais pas s'il s'agit d'une variation syntaxique de l'écriture de la même chose (c'est-à-dire si deux arguments sont effectivement passés dans la reduce()fonction) ou si un argument est omis ou non et si oui, comment cela pourrait affecter les cas d'utilisation la fonction.

Réponses

2 Sweeper Sep 13 2020 at 11:20

Ce que vous voyez est une fermeture de fin .

Vous écrivez une fermeture de fin après les parenthèses de l'appel de fonction , même si la fermeture de fin est toujours un argument de la fonction . Lorsque vous utilisez la syntaxe de fermeture de fin, vous n'écrivez pas l'étiquette d'argument pour la première fermeture dans le cadre de l'appel de fonction.

(c'est moi qui souligne)

À partir de Swift 5.3, vous pouvez écrire plusieurs fermetures de fin pour un appel de fonction. Avant cela, seul le dernier argument, qui est aussi une fermeture, peut être une fermeture de fin.

Donc, l' reduceappel équivaut à:

let totalIncome = peopleArray.reduce(0, {(result, next) -> Double in
    return result + next.income
})

Je ne sais pas s'il s'agit d'une variation syntaxique de l'écriture de la même chose (c'est-à-dire si d'une manière ou d'une autre deux arguments sont effectivement passés dans la reduce()fonction)

Oui, ce n'est qu'une variation syntaxique, ou "sucre syntaxique" comme nous aimerions l'appeler.