protocol ValueHolder {
}
struct A: ValueHolder {
var value = 5
}
var x: ValueHolder = A()
func f(a: inout A) {
a.value = 10
}
我想使用将 x 传递给 f。可能吗?
编辑:我了解所有员工关于值语义和输入输出参数的信息。问题是 x
需要转换为 A
我想知道是否可以在不复制它的情况下完成(as
制作一个类型化的副本它),这样我就可以在 x
上使用 f
。
最佳答案
I want to use pass x (and not its copy) to f. Is it possible?
不完全正确——至少,如果参数是 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
关于Swift 将协议(protocol)类型转换为 struct 并作为 inout 传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41387006/