出现错误的ForEach方法“编译器无法在合理的时间内对该表达式进行类型检查;”

时间:2020-10-31 06:00:34

标签: swiftui

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

2 个答案:

答案 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)

将其缩小为较小的视图。例如,使每个组成为一个单独的子视图。

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