2017-07-24 1 views
5

Warum += nicht mit implizit ungeöffneten optionals arbeiten, zum Beispiel:Warum `+ = 'nicht mit implizit ungeöffneten optionals arbeiten

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

Warum ist nicht die optionale implizit ausgepackt, wie im Fall von count = count + 10?

+1

Der Bediener benötigt eine Referenz. – Sulthan

+0

können Sie es mehr erklären? –

+0

Die Funktion "+ =" verbraucht eine Int. Sie geben es ein Int !. – scord

Antwort

2

Es funktioniert nicht, da der zusammengesetzte Zuweisungsoperator += erwartet, dass die linke Seite eine veränderbare Int Variable ist. Wenn Sie es count übergeben, wickelt der Compiler das implizit unverpackte optionale Element ab und sendet stattdessen einen unveränderlichen Int-Wert, der nicht als inout-Parameter übergeben werden kann, der += erwartet.

Wenn Sie wirklich tun möchten, können Sie += überlasten:

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

Jetzt += sendet die linke Seite als implizit ungeöffneten optional ohne es auszupacken und das Auswickeln explizit in der Funktion erfolgt.

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

also, warum zählen + 10 funktioniert? –

+0

Diese Antwort ist nicht korrekt. In dem Ausdruck "count + = 10" wird "count" implizit in einen konkreten ("Int") -Wert ausgepackt, aber dieser Wert _ist unveränderlich_ (eine Eigenschaft der umschlossenen Wertdarstellung eines implizit nicht ausgepackten optionalen _, wenn es bereitgestellt wird implizit_). Da das erste Argument (oder die linke Seite) der Methode '+ =' (/ operator) ein 'inout'-Parameter ist, können Sie natürlich keine unveränderlichen Eigenschaften an sie übergeben. – dfri

+0

(... Der benutzerdefinierte '+ =' -Operator oben bietet nur eine spezifischere Überladung für den Fall, wenn 'lhs' vom Typ (' inout') 'Int!' Ist und 'rhs' vom Typ' Int' ist bedeutet, dass es nicht notwendig ist, "count" im Aufruf "count + = 10" zu entpacken (um die Überladung "(+ =) (inout Int, Int)"), da es für diesen Aufruf eine perfekte Überlastungsübereinstimmung gibt Der Körper der Überladung entpackt jedoch explizit den umschlossenen Wert, was eine Mutation erlaubt. – dfri

Verwandte Themen