swift - 带状态的 ForEach 循环

Posted

技术标签:

【中文标题】swift - 带状态的 ForEach 循环【英文标题】:swift - ForEach loop with state 【发布时间】:2020-07-29 01:00:32 【问题描述】:

如果我有这个代码:

@State var n = 3
var body: some View 
    VStack 
        Button(action:
            if self.n == 3 
                self.n = 5
             else 
                self.n = 3
            
        ) 
            Text("Click me")
        
        ForEach(1..<self.n+1)  i in
            Text(String(i))
        
    

我希望此代码在您单击按钮时在屏幕上12312345 之间切换,但它只显示@987654330 @23。我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

你使用的ForEach的形式在item数量不变的情况下是可以的,但是如果Views可能会改变,那么你需要要么提供符合协议Identifiable的item,要么使用表单的ForEach 提供id:

ForEach(1..<self.n+1, id: \.self)  i in
    Text(String(i))

作为id 传递的值是一个KeyPath,它告诉SwiftUI 将项目的哪个属性用作其标识符。对于Int,您可以只使用Int 的值,该值可以通过.self 属性访问。

SwiftUI 使用标识符来了解 ForEach 中的项目何时被添加或删除,因此它需要它们才能让您看到更改。

【讨论】:

以上是关于swift - 带状态的 ForEach 循环的主要内容,如果未能解决你的问题,请参考以下文章

JSTL-3

Swift 中的 ForEach 循环使用二维数组的内容

如何使用 Swift 对我的项目中的 Foreach 循环中的“金钱”值求和? [关闭]

Swift 添加一个按钮,从使用 foreach 循环的列表中删除行

Parallel.ForEach 使用多线遍历循环

for 与forEach的区别