2014-06-05 4 views
1

Conformément à la documentation officielle, les opérateurs intégrés de Swift sont des fonctions globales définies avec l'attribut @infix.Type et invocation des opérateurs de Swift

En tant que tel, est-ce que la seule façon d'invoquer une telle fonction est de l'avoir entre deux types pour lesquels l'opérateur a été défini? Ou est-il possible de faire quelque chose de semblable à par ex. +(3,3)?

Ce qui me fait penser que c'est une déclaration valide:

Array(1...10).reduce(0, +) 

Comment, exactement, sera le + être invoqué dans le cas ci-dessus? Y a-t-il une différence avec ce morceau de code?

Array(1...10).reduce(0, {$0 + $1}) 

Répondre

2

Dans Swift, les fonctions sont nommées simplement fermetures et est donc +. Donc, les deux lignes sont à peu près identiques. (Le second l'encapsule simplement dans une invocation supplémentaire.)

Vous ne pouvez pas faire +(3, 3), car un opérateur ne peut pas être infixe et préfixe en même temps. Cependant, vous pouvez après le référencement avec un autre nom: (. Écriture + sans le mettre dans le tuple seul élément semble confondre le compilateur)

let function: (Int, Int) -> Int = (+) 
function(5, 6) // 11 

+0

Cette invocation supplémentaire de la '{$ 0 + 1 $ } 'sera probablement supprimé par l'optimiseur, il est donc probable que les deux lignes soient compilées avec le même code. – rickster

Questions connexes