我目前正在使用SwiftUI开发应用程序。
我遇到错误The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions
有一些关于相同错误的文章,我试图解决这个问题,但是我无法解决这个问题...
有人会建议我如何解决这个问题吗?
代码如下:
已编辑
import SwiftUI
struct InfoView: View {
@EnvironmentObject var appState: AppState
var body: some View {
Button(action: {
appState.makeGetCallInfo()
}) {
Text("Hit API")
}
ForEach(appState.arrayInfos ?? []){ info in
VStack{
Group{
Text(String(info.id))
Text(String(info.no_1))
Text(String(info.no_2))
Text(info.name_1)
Text(info.name_2 ?? "")
Text(info.name_3)
Text(info.name_4 ?? "")
Text(String(info.no_3 ?? 0))
Text(info.name_5 ?? "")
Text(String(info.no_4 ?? 0))
}
Group{
Text(String(info.no_5 ?? 0))
Text(info.name_6 ?? "")
Text(String(info.no_7))
Text(String(info.no_8))
Text(info.name_7 ?? "")
Text(info.name_8)
Text(info.memo ?? "")
Text(info.created_at)
Text(info.updated_at)
Text(String(info.userId))
}
Divider()
.padding()
}
}
}
}
如果像下面那样减少VStack中的子视图数量,则效果很好。错误消失
import SwiftUI
struct InfoView: View {
@EnvironmentObject var appState: AppState
var body: some View {
ForEach(appState.arrayInfos ?? []){ info in
VStack{
Group{
Text(String(info.id))
Text(String(info.no_1))
Text(String(info.no_2))
Text(info.name_1)
Text(info.name_2 ?? "")
Text(info.name_3)
Text(info.name_4 ?? "")
Text(String(info.no_3 ?? 0))
Text(info.name_5 ?? "")
Text(String(info.no_4 ?? 0))
}
Divider()
.padding()
}
}
}
}
AppState.swift
import SwiftUI
import Foundation
import Combine
class AppState: ObservableObject {
@Published var arrayInfos:[Infos]?
func makeGetCallInfo() {
// Set up the URL request
let endpoint: String = "https://sample.com/api/info/?user=1"
guard let url = URL(string: endpoint) else {
print("Error: cannot create URL")
return
}
var urlRequest = URLRequest(url: url)
urlRequest.addValue("token xxxxxxxxxxxxxxxxxxx", forHTTPHeaderField: "authorization")
// set up the session
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
// make the request
let task = session.dataTask(with: urlRequest) {
(data, response, error) in
// check for any errors
guard error == nil else {
print("error calling GET")
print(error!)
return
}
// make sure we got data
guard let responseData = data else {
print("Error: did not receive data")
return
}
// parse the result as JSON, since that's what the API provides
DispatchQueue.main.async {
do{ self.arrayInfos = try JSONDecoder().decode([Infos].self, from: responseData)
}catch{
print("Error: did not decode")
return
}
}
}
task.resume()
}
JsonModel.swift
import Foundation
struct Infos: Codable,Identifiable {
var id: Int
var no_1: Int
var no_2: Int
var name_1: String
var name_2: String?
var name_3: String
var name_4: String?
var no_3: Int?
var name_5: String?
var no_4: Int?
var no_5: Int?
var name_6: String?
var no_7: Int
var no_8: Int
var name_7: String?
var name_8: String
var memo: String?
var created_at: String
var updated_at: String
var userId: Int
}
Xcode:版本12.0.1
答案 0 :(得分:0)
您的VStack包含太多子视图,最多只能包含10个子视图。因此,请按较小的数量对它们进行分组,如下所示
VStack{
Group {
Text(String(info.id))
Text(String(info.no_1))
Text(String(info.no_2))
Text(info.name_1)
Text(info.name_2 ?? "")
Text(info.name_3)
Text(info.name_4 ?? "")
Text(String(info.no_3 ?? 0))
Text(info.name_5 ?? "")
Text(String(info.no_4 ?? 0))
}
Group {
Text(String(info.no_5 ?? 0))
Text(info.name_6 ?? "")
Text(String(info.no_7))
Text(String(info.no_8))
Text(info.name_7 ?? "")
Text(info.name_8)
Text(info.memo ?? "")
Text(info.created_at)
Text(info.updated_at)
Text(String(info.userId))
}
Divider()
.padding()
}
注意:最好将这样的大容器分成专用视图,然后在此处创建。
答案 1 :(得分:0)
将其缩小为较小的视图。例如,使每个组成为一个单独的子视图。
将信息对象从循环中传递到子视图中