Swift 将协议类型转换为结构并作为 inout 传递

Swift cast protocol type to struct and pass as inout

protocol ValueHolder {
}

struct A: ValueHolder {
    var value = 5
}

var x: ValueHolder = A()

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

我想将 x 传递给 f。可能吗?

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

I want to use pass x (and not its copy) to f. Is it possible?

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

既然如此,你的问题似乎就失去了意义。由于结构不能就地改变,所以根本没有真正的理由在这里使用 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