Swift 按值传递类

Swift 按值传递类,swift,Swift,我是Swift的新手,所以如果我错过了一些明显的痛苦,请告诉我。我有一个类,我想通过值传递它来重载+操作符 如果我将左参数lhs定义为foo,代码将不起作用,但是如果lhs是inout foo,代码将起作用,但是我修改了lhs,这显然是我不想要的 我的班级的简要分类: class foo<T: Numeric> { /* Data */ /* Init Fn */ /* += definition */ static func + (lhs: foo,

我是Swift的新手,所以如果我错过了一些明显的痛苦,请告诉我。我有一个
,我想通过值传递它来重载
+
操作符

如果我将左参数
lhs
定义为
foo
,代码将不起作用,但是如果
lhs
inout 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 */
        }
    }
}
是否有一种我不知道的方法,或者在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)
class-Foo{
var值:T
初始值(值:T){
自我价值=价值
}
静态函数+(左:Foo,右:Foo)->Foo{
返回Foo(值:lhs.value+rhs.value)
}
静态函数+=(左:Foo,右:Foo){
左S.值+=右S.值
}
}
设十=Foo(值:10)
设18=10+Foo(值:8)
十八+=Foo(值:1)

您想在不修改
y
的情况下执行
y+=x
?这样的操作的预期结果是什么?我想在函数中局部修改<代码> y>代码>而不是修改它的引用。在C++中,您可以决定在堆栈上分配类。在Swift中,所有的类都在堆中离开。不能将类作为值传递。我认为C++是用模糊的LVAL-RUVE规则,而不是SWIFT。您应该从使用
+=
定义
+=
开始,而不是相反。我不明白这个问题:通过按值传递对象实例,您希望实现什么?你想让
+
返回
lhs
的修改副本,而不是修改现有实例吗?这就是我要找的,太好了!在C++中,它的另一种方式是:<代码> +/>代码>运算符由<代码> += 运算符定义,我猜这就是为什么我一直在挣扎。真奇怪@Z4ckZ3r0实际上我在考虑结构。我已经纠正了理由。问题是不能使用一个操作符定义另一个操作符,因为在一个操作符中,您正在创建一个新对象,而在第二个操作符中,您正在修改现有对象。对于值类型,这不会是问题。
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)