2017-02-26 4 views
3

Ich habe einen Typ, der eine benutzerdefinierte + definiert hat. Ich frage mich, ob es für Swift möglich war, automatisch eine Definition für += zu schreiben, nämlich a += b ->a = a+b. Idealerweise müsste ich nicht für jeden Operator, den ich schreibe, den entsprechenden Zuweisungsoperator schreiben.Haben Sie automatisch + = definiert, wenn Sie + definieren?

Beispielcode:

class A { 
    var value: Int 

    init(_ value: Int) { 
     self.value = value 
    } 

    static func +(lhs: A, rhs: A) -> A { 
     return A(lhs.value + rhs.value) 
    } 
} 

var a = A(42) 
let b = A(10) 

// OK 
let c = a + b 

// error: binary operator '+=' cannot be applied to two 'A' operands 
// Ideally, this would work out of the box by turning it into a = a+b 
a += b 
+0

Konnten Sie den Code für die überladene Operatormethode bekannt geben? – ZeMoon

+0

@ZeMoon Ich habe Beispielcode hinzugefügt – BallpointBen

Antwort

4

Normalerweise haben Sie += zu definieren, wenn Sie + definieren.

Sie könnten ein Summable Protokoll erstellen, das sowohl + und += erklärt, aber Sie werden immer noch keine konkrete Bedeutung der + Funktion, da die Zugabe von beliebigen Typen hat zu definieren. Hier ein Beispiel:

protocol Summable { 
    static func +(lhs: Self, rhs: Self) -> Self 
    static func +=(lhs: inout Self, rhs: Self) 
} 

extension Summable { 
    static func +=(lhs: inout Self, rhs: Self) { lhs = lhs + rhs } 
} 

struct S: Summable { } 

func +(lhs: S, rhs: S) -> S { 
    // return whatever it means to add a type of S to S 
    return S() 
} 

func f() { 
    let s0 = S() 
    let s1 = S() 
    let _ = s0 + s1 

    var s3 = S() 

    s3 += S() // you get this "for free" because S is Summable 
} 
+0

Danke. Gibt es einen Grund, warum Swift das nicht automatisch macht? – BallpointBen

+0

Für einfache Typen wie 'Int'' + = 'ist wohldefiniert. Wenn Sie einen komplexeren benutzerdefinierten Typ haben, kann es zu Nebeneffekten kommen, die linke Seite der Gleichung "+ =" zu ändern, die Sie nicht möchten. Aus Gründen der Einfachheit und/oder Sicherheit kann es immer das einzig Richtige sein, jedes Mal ein neues Objekt zu konstruieren, indem man '+' benutzt. Eine explizite Deklaration von "+ =" ist daher aus Sicht von Swift die korrekte Anforderung. Wenn Sie 'Summable' verwenden, sagen Sie, dass Sie die Nebenwirkungen von' + = 'verstehen (und damit einverstanden sind). – par

+0

Ich dachte, dass das Schreiben von '+ =' bedeuten würde, dass du mit der Addition gut auskommst. Ich nahm an, dass es syntaktischer Zucker war, kein realer Bestandteil der Sprache. – BallpointBen

Verwandte Themen