gpt4 book ai didi

swift - 创建一个@State var 区域,即基于两个@State var 宽度,一个@State var 高度

转载 作者:行者123 更新时间:2023-12-04 00:24:01 27 4
gpt4 key购买 nike

如何将多个状态变量组合成另一个?

我想通过一些用户交互来更改高度或宽度的值,并相应地更新 View 中的所有内容。所以高度或宽度会改变,面积也会改变。

我想它看起来像这样

@State var width: CGFloat = 50.0
@State var height: CGFloat = 100.0


@State var area: CGFloat // somehow equal to width*height

当前的解决方案只是调用一个函数

func area() -> CGFloat {
width * height
}

最佳答案

不要使 area @State;只需将其设为计算变量即可:

@State var height: CGFloat = 50.0
@State var width: CGFloat = 100.0
var area: CGFloat {
width * height
}
var body: some View {
VStack {
Text("Width: \(width)")
Text("Height: \(height)")
Text("Area \(area)")
Button(action: {
self.height *= 2
}) {
Text("Double height")
}
Button(action: {
self.width += 10
}) {
Text("Add 10 to width")
}
}
}

我添加了一些代码来说明如果 widthheight 改变,area 也会改变,因为 widthheight 更改会导致 View 被重绘,因为它们是 @State。由于计算了area,因此在重绘 View 时,area被确定为更新后的widthheight 值。不过,像您在当前解决方案中所说的那样将其作为一个函数也应该可以工作。

如果您希望 area 成为 @State 以便您可以将其作为 Binding 传递给其他 View ,请执行以下操作:

struct ContentView: View {
@State var height: CGFloat = 50.0
@State var width: CGFloat = 100.0
var area: Binding<CGFloat> {
Binding(get: {
self.height * self.width
}) { (newVal) in

}
}
var body: some View {
VStack {
Text("Width: \(width)")
Text("Height: \(height)")
Text("Area \(area.wrappedValue)")
BindingView(num: area)
BindingView(num: $height)
Button(action: {
self.height *= 2
}) {
Text("Double height")
}
Button(action: {
self.width += 10
}) {
Text("Add 10 to width")
}
}
}

struct BindingView: View {
@Binding var num: CGFloat
var body: some View {
Text("Binding number: \(num)")
}
}

我创建了 BindingView 作为如何以不同方式使用绑定(bind)的示例。对于 @State 变量,您可以通过添加 $ 前缀将它们有效地转换为 Binding,但由于 area 是明确的 Binding,您不需要 $。同样要访问 Binding 中的值,您只需执行变量 .wrappedValue

关于swift - 创建一个@State var 区域,即基于两个@State var 宽度,一个@State var 高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58386001/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com