Swift转换协议类型为struct并传递为inout

时间:2016-12-29 20:52:36

标签: swift struct protocols inout

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

1 个答案:

答案 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