繁体   English   中英

Swift:更新结构变量?

[英]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.xbar.x之间没有进一步的联系。

发生这种情况是因为在 Swift 中参数是按值传递的。

解决方案

首先我们需要一个通用的包装器

class Wrapper<Element> {
    var element: Element
    init(element: Element) {
        self.element = element
    }
}

现在我们可以重新定义FooBar

struct Foo {
    var x: Wrapper<Float>
    mutating func change() {
        x.element += 1
    }
}

struct Bar {
    var y: Wrapper<Float>
}

正如你可以看到现在FooBar不成立的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM