2017-02-26 115 views
3

我有一個爲其定義的自定義+的類型。我想知道Swift是否可以自動爲+=寫一個定義,即a += b - >a = a+b。理想情況下,我不必爲我寫的每個操作員編寫相應的賦值操作符。定義+時自動定義+ =?

示例代碼:

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

你可以發佈重載操作符方法的代碼嗎? – ZeMoon

+0

@ZeMoon我添加了示例代碼 – BallpointBen

回答

4

通常你必須定義+=當你定義+

您可以創建一個Summable協議,聲明既++=,但你仍然需要定義+功能,因爲除了任意類型的沒有具體的含義。這裏有一個例子:

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

謝謝。 Swift不會自動執行此操作嗎? – BallpointBen

+0

對於簡單的類型,例如'Int'' + ='是明確的。當你有一個更復雜的自定義類型時,可能會有副作用來修改你不想要的'+ ='方程的左邊。爲了簡單和/或安全,每次使用「+」構建新對象可能是唯一正確的事情。因此,從Swift的角度來看,明確聲明'+ ='是正確的要求。當你使用'Summable'時,你說你明白(並且可以)''+ ='的副作用。 – par

+0

我認爲編寫'+ ='意味着你可以執行加法操作。我認爲它是語法糖,而不是語言的真正組成部分。 – BallpointBen