Swift 将协议(protocol)类型转换为 struct 并作为 inout 传递

标签 swift struct protocols inout

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/

相关文章:

c++ - 结构 vector 工程

c# - 为什么struct比float慢?

ios - Swift func with generic where constraint is a protocol which self conforms

pointers - 从指针中检索用户名对象 - Parse, swift

json - 解码编码不佳的 JSON(嵌套过多、许多可能的键、键与值混淆)

swift - 使用多个 TableView ?

ios - 如何使用协议(protocol)在两个 View Controller 之间传递值

swift - 如何在 Swift 中将变量传递回父级

ios - 此版本不支持 Collection View 单元格内容 View 。至少使用 Xcode 11.0 打开此文档

ios - 如何使用 ReactiveSwift 将有错误的信号转换为 NoError 信号? (并且要优雅)