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
制作它的打字副本)以便我可以使用 f
在 x
.
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
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
制作它的打字副本)以便我可以使用 f
在 x
.
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