【问题标题】:The compiler is unable to type-check - SwiftUI编译器无法进行类型检查 - SwiftUI
【发布时间】:2021-01-12 19:36:27
【问题描述】:

我正在尝试快速适应 MVVM 模式。所以我编码了一下,我一次又一次地得到这个错误:

编译器无法在合理的时间内对该表达式进行类型检查;尝试将表达式分解为不同的子表达式

我在这里阅读了很多内容,并且我知道将代码分解为较小的和平会有所帮助 - 但是对于 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()
    }
}

希望收到您的来信 - 提前致谢。

【问题讨论】:

  • 请添加PizzaModel的代码

标签: compiler-errors swiftui typechecking compile-time-type-checking


【解决方案1】:

如果你想这样写,请确保你的 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)

【讨论】:

  • 顺便说一句,如果您愿意,您绝对可以将您的代码分成更小的部分。您可以将 NavigationLink 标签放入单独的计算属性或其他结构中以简化代码。
  • 是的,我使用了 UUID - 我将尝试使用 hashable。 ??
  • 在我使用 Hashable 之后 - 仍然没有工作。我明白了,也许我的 xcode 超载了,但我不知道为什么。我的意思是,那不是很长或很复杂的代码...
  • 这意味着您的代码还有其他问题。上面关于模型的示例有效,因此请确保您将可散列/可识别放在正确的位置并具有正确的列表参数。 Swift 通常会在出现错误但无法确定是什么时抛出类型检查诊断。
  • 非常感谢!我删除了该项目并再次执行此操作,现在它可以工作了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
  • 2020-06-30
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
相关资源
最近更新 更多