@AppStorage 不更新视图

@AppStorage not updating view

我在 Swift/SwiftUI.

中有以下复制示例

预期功能: 号码列表,删除任何号码后,号码会更新并重新排列,以便它们按连续顺序排列。

示例:假设我们在列表中有数字 1、2、3、4。当我们删除数字 2 时,列表应该变成 1, 2, 3 而不是像 1, 3, 4 一样。

问题:@State 用于保存数字数组时,代码按预期工作。但是,当@AppStorage中的数组用于保存数组时,视图似乎没有update/change数字。

那么,为什么我不能使用 @AppStorage 方法,我该如何解决这个问题?

我知道代码看起来很多,但是如果你只看评论,你基本上可以忽略它。它只是一个具有几个功能的 body,没什么特别的。

class MyObj: Codable, Identifiable {      //SIMPLE OBJECT TO HOLD A NUMBER
    init(num: Int) {
        self.num = num
    }
    
    var id: UUID = UUID()
    var num: Int
}

struct test2: View {
    
    @State var array: [MyObj] = []                             //USING THIS (@State) WORKS
    //AppStorage("array") var array: [MyObj] = []              //USING THIS (@AppStorage) DOESN’T UPDATE NUMBERS
    
    func minimizeNums() {
        for i in 0..<array.count {         //MAKES NUMBERS IN ORDER/CONSECUTIVE
            array[i].num = i
        }
    }
    
    var body: some View {
        VStack {
            Button("add number object") {
                array.append(MyObj(num: array.count))
            }
            
            List {
                ForEach(array) { obj in
                    Text(String(obj.num))
                }
                .onDelete(perform: { index in         
                    array.remove(atOffsets: index)      //REMOVES NUMBER OBJECT FROM LIST
                    minimizeNums()                //MAKES THE REMAINING OBJECT'S NUMBERS CONSECUTIVE
                })
            }
        }
    }
}

重要提示: 我使用了 接受的答案的扩展,以便将数组存储在 @AppStorage 中。我认为此扩展程序可能是导致问题的原因,但我不确定是如何造成的!

这是失败的,因为您正在为您的模型 MyObj 使用 class。使用具有 SwiftUI 的结构有多种原因。请阅读 Blog entry 或任何其他教程或文档。

[TLDR]: 不要使用 class 而是使用结构。

MyObj 更改为:

struct MyObj: Codable, Identifiable {     
    init(num: Int) {
        self.num = num
    }
    
    var id: UUID = UUID()
    var num: Int
}

应该可以。