我希望根据数组的索引设置ForEach视图的动画,以下是我的代码:

struct ContentView: View {
    
    @State private var array: [MyType] = [MyType("A"), MyType("B"), MyType("C"), MyType("D")]
    
    var body: some View {
        
        VStack(spacing: 10.0) {
            
            ForEach(array, id:\.id) { item in
                Text(item.string)
                    .frame(width: 25, height: 25)
                    .background(Color.gray.opacity(0.5).cornerRadius(5.0))
            }
            .animation(.default, value: array)

            Button("Move to down") {
                
                array.indices.forEach { index in
                    
                    if ((array[index].index + 1) < array.count) { array[index].index += 1 }
                    else { array[index].index = 0 }
                    
                }
                
                array.sort(by: { (lhs, rhs) in return (lhs.index < rhs.index) })
                
            }
 
        }
        .fixedSize()
        .padding()

    }

}


struct MyType: Equatable {
    
    private static var nextIndexValue: Int = 0
    
    let id: UUID = UUID()
    var index: Int
    var string: String
    
    init(_ string: String) {
        self.index = MyType.nextIndexValue
        self.string = string
        MyType.nextIndexValue += 1
    }
    
}

当我面对一个小尺寸的数组时,这种方法似乎工作得很好,我使用这种方法的问题是,我必须应用一次更新索引逻辑,然后在它之后对数组进行排序.我认为这是一种好的方法,但还很遥远.我想知道是否有更简单的方法或方法可以更好地处理大型array.这个问题的目的是寻找一种在性能上更好的方法.

推荐答案

我不太确定你是什么意思,但Next以更简单的方式做了同样的事情,完全不依赖于指数:

Button("Move to down") {
    let last = array.removeLast()
    array.insert(last, at: 0)
}

Swift相关问答推荐

在Swift中initt()完成后运行一个函数

向文本元素添加背景色失败

Swift-Can无法在AudioKit中找出简单的麦克风效果-文件链

当TextField变为空时,不会触发onChange

SwiftUI:为什么@State在子视图中持续存在?

为什么枚举上的.allCases.forEach不是循环(继续和中断不起作用)?

是否可以使用一个 NSRegularExpression 同时判断字符串格式并提取子字符串?

Swift UI中视图上的值未更新

根据其属性组合 2 个模型以在 Swift 中创建另一个模型

如何使用 Swinject 注册符合 ObservableObject 的协议?

SwiftUI View Builder 参数无法更改状态

如果没有标记,则为 Swift 预处理器

AES 加密和解密

在 iOS 中使用 Swift 保存 PDF 文件并显示它们

关闭 UITableViewRowAction

用 UIBezierPath 画一条线

在 Swiftui 中是否有一种简单的方法可以通过捏合来放大图像?

如何在 SwiftUI 中的一个视图上显示两个alert ?

如何快速格式化用户显示(社交网络等)的时间间隔?

如何将应用程序与 iOS 联系人应用程序集成?