[英]Swift: Updating struct variables?
我对 Swift 相当陌生,今天我偶然发现了这个问题,如果得到回答,这将对我有很大帮助。 下面的代码解释了我的问题:
struct Foo {
var x: Float
mutating func change() {
x += 1
}
}
struct Bar {
var y: Float
}
var foo = Foo(x: 1)
let bar = Bar(y: foo.x)
foo.change()
print(foo.x) // 2.0
print(bar.y) // 1.0 (how can I make this 2.0 as well?)
我想我可能必须使用指针,但我不知道如何使用,而且我不知道这是否有效。 任何想法都会有所帮助!
在此处获得所需内容的一种方法是定义Bar
以保留对Foo
的引用。 并且由于您希望对Foo
的实例进行更改以延续到Bar
持有的引用,因此您需要将Foo
设为类而不是结构体。
这是一种可能的解决方案:
class Foo {
var x: Float
init(x: Float) {
self.x = x
}
func change() {
x += 1
}
}
struct Bar {
var foo : Foo
var y : Float { return foo.x }
init(foo: Foo) {
self.foo = foo
}
}
var foo = Foo(x: 1)
let bar = Bar(foo: foo)
foo.change()
print(foo.x) // 2.0
print(bar.y) // 2.0 as asked
当你写
let bar = Bar(y: foo.x)
值foo.x
( 1
) 被复制到Bar
。
所以不存在foo.x
和bar.x
之间没有进一步的联系。
发生这种情况是因为在 Swift 中参数是按值传递的。
首先我们需要一个通用的包装器
class Wrapper<Element> {
var element: Element
init(element: Element) {
self.element = element
}
}
现在我们可以重新定义Foo
和Bar
struct Foo {
var x: Wrapper<Float>
mutating func change() {
x.element += 1
}
}
struct Bar {
var y: Wrapper<Float>
}
正如你可以看到现在
Foo
和Bar
不成立的Float
值,但一个参考Float
值。 我们将使用它来使 foo 和 bar 值引用相同的Float
值。
最后,我们可以测试两个结构中的值是否发生了变化
var foo = Foo(x: Wrapper<Float>(element: 1))
let bar = Bar(y: foo.x)
foo.change()
print(foo.x.element) // prints 2.0
print(bar.y.element) // prints 2.0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.