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
生成它的类型副本)以便我可以使用{{ 1}} f
。
答案 0 :(得分: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