swiftUI编译器无法键入检查此。。。尝试使用服务器API中的数据时
我发出网络请求并希望解析和显示结果,但它并没有编译并给出结果swiftUI编译器无法键入检查此。。。尝试使用服务器API中的数据时,swift,swiftui,Swift,Swiftui,我发出网络请求并希望解析和显示结果,但它并没有编译并给出结果 The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expression 我有这样的看法: struct SummaryView: View { @EnvironmentObject var state: AppState @State var
The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expression
我有这样的看法:
struct SummaryView: View {
@EnvironmentObject var state: AppState
@State var responsePriceFromServer: OrderStatusResp? = nil
@State var loading: Bool = true
var body: some View {
self.state.makeAPICall( success: nil, successData: { data in
if let d = try! JSONDecoder().decode(OrderStatusResp?.self, from: data) {
DispatchQueue.main.async {
responsePriceFromServer = d
loading = false
}
return
}
}, failure: { err in
print("Failed to load client order detail: " + err)
}
)
return ZStack(alignment: .bottom) {
if !loading {
VStack(alignment: .leading) {
responsePriceFromServer?.order?.amount
}
}else {
ZStack(alignment: .center) {
Color(rgb: "FEFEFE")
}
}
}
}
}
而这个反应类:
struct OrderStatusResp: Hashable, Codable {
var order: OrderStatus?
var result: Bool?
var msg: String?
}
struct OrderStatus: Hashable, Codable {
var id: Int?
var status: Int?
var paid: Int?
var amount: Int?
var discountSum: Int?
var items: [OrderStatusItem]
}
struct OrderStatusItem: Hashable, Codable {
var price: Int
var discounted: Int
var total: Int
var name: String
var code: Int
var quantity: Int
}
但是,当我以这种方式显示它时,它工作正常:
Text("\(state.responsePriceFromServer?.order?.items ?? [] )")
有什么问题
附言
我从堆栈和文档中搜索了其他类似的答案,但当编译器说它无法在合理的时间内编译某些内容时,没有任何帮助: 答复 在
VStack
中,您不能输入普通字符串,因为普通字符串不是视图
,而VStack
只接受视图
。您必须执行VStack{Text(someString)}
而不是VStack{Text(someString)}
,因为Text
是一个视图
(例如,符合视图
协议)
笔记
不要这样对自己!不要像那样在视图主体中调用api,这会导致太多api调用,超出您的需要。而是在
.onAppear()
中执行api调用,此responsePriceFromServer?.order?.amount
需要展开,然后添加到文本中。不能以这种方式显示值。如果您想显示文本,那么它需要类似于文本(\(responsePriceFromServer?.order?.amount?0)”)
。进行API调用的方式似乎非常糟糕。。。如果在body属性上调用该属性,则会在每个body渲染上调用API!