2017-07-24 3 views
5

Pourquoi += fonctionne pas avec optionals implicitement non emballés, par exemple:Pourquoi `` + = fonctionne pas avec optionals implicitement déballé

var count: Int! = 10 
count = count + 10 // This works 
count += 10 // this does not work 

Pourquoi ne pas l'option implicitement non emballés, comme le cas de count = count + 10?

+1

L'opérateur a besoin d'une référence. – Sulthan

+0

pouvez-vous l'expliquer plus? –

+0

la fonction "+ =" dépense un Int. Vous lui donnez un Int !. – scord

Répondre

2

Cela ne fonctionne pas car l'opérateur d'affectation composé += s'attend à ce que le côté gauche soit une variable mutable Int. Lorsque vous le passez count, le compilateur déballe l'option implicitement déballée et envoie une valeur Int non modifiable, qui ne peut pas être transmise comme le paramètre inout attendu par +=.

Si vous voulez vraiment faire cela, vous pouvez surcharger +=:

func += (left: inout Int!, right: Int) { 
    left = left! + right 
} 

Maintenant += envoie le côté gauche en option implicitement déballés sans déballer, et le dépliage est fait explicitement dans la fonction.

var count: Int! = 10 
count = count + 10 // 20 
count += 10 // 30 
+0

alors pourquoi compter + 10 fonctionne? –

+0

Cette réponse est incorrecte. Dans l'expression 'count + = 10',' count' sera implicitement déroulé dans une valeur concrète ('Int'), mais cette valeur _will sera immutable_ (une propriété de la représentation de la valeur enveloppée d'une option facultative _ quand elle est fournie implicitement_). Comme le premier argument (ou côté gauche) de la méthode '+ =' (/ opérateur) est un paramètre 'inout', vous ne pouvez naturellement pas lui passer des propriétés immuables. – dfri

+0

(... L'opérateur personnalisé '+ =' ci-dessus fournit juste une surcharge plus spécifique pour le cas où 'lhs' est de type (' inout') 'Int!' Et 'rhs' est de type 'Int'. signifie qu'il n'y aura pas besoin de déplier implicitement 'count' dans l'appel' count + = 10' (pour correspondre à la surcharge '(+ =) (inout Int, Int)'), car il existe une correspondance de surcharge parfaite pour cet appel Le corps de la surcharge, cependant, déballe explicitement la valeur enveloppée, permettant la mutation de celui-ci). – dfri