我是斯威夫特的新手,如果我错过了一些明显的痛苦,请告诉我。我有一个class要传递给值以重载+运算符。
如果我将左参数lhs定义为foo则代码不起作用,但它是不可变的,如果lhsinout foo则代码起作用,但随后我修改了lhs,这显然是我不想要的。
我的班级很快就崩溃了:

class foo<T: Numeric> {
    /* Data */
    /* Init Fn */
    /* += definition */
    static func + (lhs: foo, rhs: foo) -> foo {
        do {
            try lhs += rhs
            return lhs
        } catch {
            /* Error Handling */
        }
    }
}

我来自一个c++背景,所以我很惊讶如果我选择的话,我无法按值传递对象。在问题What are the basic rules and idioms for operator overloading?之后,在c++中,这个重载方法希望左参数按值传递,右参数按const &传递,如下所示,但这里我似乎没有这个选项。
class X {
    /* In Swift operators are not defined internally like this */
    X& operator+=(const X& rhs) {
        // actual addition of rhs to *this
        return *this;
    }
};
inline X operator+(X lhs, const X& rhs) {
    lhs += rhs;
    return lhs;
}

有没有一种我不知道的方法,或者重载在swift中是以不同的方式完成的?
任何帮助都将不胜感激。

最佳答案

我看不出易变性有什么真正的问题。注意,对于类,如果不传递值,就不能使用一个运算符来定义另一个运算符。

class Foo<T: Numeric> {
    var value: T

    init(value: T) {
        self.value = value
    }

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

    static func += (lhs: Foo, rhs: Foo) {
        lhs.value += rhs.value
    }
}

let ten = Foo<Int>(value: 10)
let eighteen = ten + Foo<Int>(value: 8)
eighteen += Foo<Int>(value: 1)

关于swift - 值(value)传授,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54737922/

10-11 14:20