编译器无法进行类型检查 - SwiftUI

The compiler is unable to type-check - SwiftUI

我正在努力适应 swift 中的 MVVM 模式。所以我写了一些代码,然后一次又一次地收到这个错误:

The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions

我在这里读了很多书,我知道将代码分解成更小的部分会有所帮助 - 但对于 SwiftUI,我的意思是,这非常困难,因为我编写的代码正是使用 SwiftUI 的方式(如果我错了请纠正我)。

所以,我现在很沮丧,试图让它发挥作用。也许有人有想法?

这是截图:

代码:

import SwiftUI

struct ContentView: View {
    
    var modelPizza = PizzaModel()
    
    var body: some View {
        
            NavigationView {
                
                List(modelPizza.pizzas) { p in
                    
                    NavigationLink(
                            destination:
                                Text("Destination"),
                        label: {
                                VStack(alignment: .leading) {
                                    Text(p.name)
                                        .font(.title)
                                        
                                    HStack {
                                        Text(p.toping1)
                                            .italic()
                                        Text(p.toping2)
                                            .italic()
                                        Text(p.toping3)
                                            .italic()
                                    }
                                }
                                    
                            })
                    }.navigationTitle("Pizzas")
                Button(action: {
                    print("Hello")
                }, label:
                Text("Hello")
                )
            }
        
        }
        
    }


struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

很想听听您的意见 - 提前致谢。

如果你想这样写,请确保你的 Pizza 结构符合 Identifiable;否则,使用 List(modelPizza.pizzas, id: \.self) 并让 Pizza 符合 Hashable。

我建议为比萨添加一个 UUID 属性 以符合 Identifiable。 下面的代码是适用于 Swift 5,Xcode 版本 12.3 的示例:

struct ContentView: View {
    
    var modelPizza = PizzaModel()
    
    var body: some View {
        NavigationView {
            List(modelPizza.pizzas) { pizza in
                NavigationLink(destination: Text("Destination")) {
                    VStack(alignment: .leading) {
                        Text(pizza.name)
                            .font(.title)
                        
                        HStack {
                            Text(pizza.topping1)
                                .italic()
                            Text(pizza.topping2)
                                .italic()
                            Text(pizza.topping3)
                                .italic()
                        }
                    }
                }
            }
        }
    }
 
    struct PizzaModel {
        var pizzas = [Pizza]()
        
        struct Pizza: Identifiable {
            var id = UUID()
            
            var name: String
            
            var topping1: String
            var topping2: String
            var topping3: String
        }
    }
}

或者:

struct PizzaModel {
    var pizzas = [Pizza]()
    
    struct Pizza: Hashable {
        var name: String
        
        var topping1: String
        var topping2: String
        var topping3: String
    }
}

并使用 List(modelPizza.pizzas, id: \.self).