有两种做法,一种是在写入数据的时候修改元素的属性,这要求 Item 必须带有 r 字段,r 字段用来 View 的显示和刷新。另一种是在 View 显示时返回需要的值。
前者因为是定制的关系,所以计算量小,但根据需求变动可能需要频繁调整 Item 的属性,代码修改起来工程量大,不灵活;后者泛用,类似于 Foreach 中的筛选,不会直接操作数据源,但代码写起来比较麻烦且计算量会比较大。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| import SwiftUI
struct ContentView: View { @State private var item: Item = .init(id: UUID(), r: 0, array: []) private func backR() -> CGFloat { let r: CGFloat = CGFloat(item.array.count) return r } var body: some View { VStack { Button(action: { item.array.append(1) item.r += 1 }) { Text("Add") } Circle() .frame(width: CGFloat(item.r), height: CGFloat(item.r)) Circle() .frame(width: backR(), height: backR()) } } }
#Preview { ContentView() }
struct Item: Identifiable{ public var id: UUID? public var r: Int public var array: Array<Any> init(id: UUID? = nil, r: Int, array: Array<Any>) { self.id = id self.r = r self.array = array } }
|