SwiftUI-如何创建和使用自定义类型的数组

问题描述

我正在尝试创建一个包含我的struct Element的数组。尝试使用.append时出现两个错误

“不能在不可变值上使用变异成员:'自身'是不可变的”和“不能将类型为“元素”的值转换为预期的参数类型为“ [元素]””

我显然做错了所有事情。

我的测试代码

var elements = [[Element]]()

var body: some View {
    
    vstack {
        ForEach (0..<26) { index in
            Text("\(index) Hello,World!")
            
            elements.append(Element(direction: "Direction \(index)",movement: "Movement \(index)",multiplier: index))
        }
    }
  }
 }
  struct Element {
    var direction: String
    var movement: String
    var multiplier: Int
  }

解决方法

您无法在ForEach内部执行任何操作。 ForEach期望从中返回单个View。但是,如果要在ForEach内附加数据,则可以在ForEach内的View上调用onAppear()闭包时执行此操作。

这是将elements数组添加到View的onAppear中后的代码。

VStack {
        ForEach (0..<26) { index in
            Text("\(index) Hello,World!").onAppear() {
            
                elements.append(Element(direction: "Direction \(index)",movement: "Movement \(index)",multiplier: index))
            }
        }
    }

您将得到“不可变的错误”,因为您可能声明了该结构内的 elements 变量,并且该结构内的属性是不可变的。因此,要附加新值,您要么需要使用 @State 注释 elements 变量,要么可以在结构外部声明它

在结构声明之外:

var elements: [Element] = []
struct MyView: View {
    
}

带有注释,但在结构声明中:

struct MyView: View {
    @State var elements: [Element] = []
}

您还需要知道,更改@State注释属性的值会更新UI,但这不必担心,因为SwiftUI计算UI中的更改并仅更新新更改