2
protocol ValueHolder {
}

struct A: ValueHolder {
    var value = 5
}

var x: ValueHolder = A()

func f(a: inout A) {
    a.value = 10
}

我想使用 pass x 到 f。可能吗?

编辑:我了解所有关于值语义和 inout 参数的工作人员。问题是x需要强制转换A,我想知道是否可以在不复制它的情况下完成(as制作它的打字副本),以便我可以使用fon x

4

1 回答 1

3

我想使用 pass x(而不是它的副本)到 f。可能吗?

不完全是——至少,如果参数是 A,则不是。A 是一个结构。即使使用inout,结构体仍然是值类型。inout允许替换原始值,但替换为另一个A。简单地说,一个结构不能原地变异。

既然如此,你的问题似乎失去了意义。由于结构不能原地变异,因此根本没有真正的理由在inout此处使用。你没有做任何需要的事情inout。您不妨放弃inout并接受值语义:

func f(a: A) -> A {
    var a = a
    a.value = 10
    return a
}
x = f(a:x as! A)

如果您真的想保留inout,则键入a:ValueHolder 并在函数内进行强制转换,如下所示:

var x: ValueHolder = A()
func f(a: inout ValueHolder) {
    var b = a as! A
    b.value = 10
    a = b
}
f(a:&x)
(x as! A).value // 10
于 2016-12-29T20:58:48.497 回答