ForEach方法出现错误"编译器无法在合理的时间内键入check this表达式;"



我目前正在使用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

您的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()
}

注意:最好将这样大的容器分离到专用视图中,然后在此处创建

将其分解为更小的视图。例如,将每个组设为单独的子视图。

将循环中的信息对象传递到子视图

最新更新