SwiftUI:编译器无法在合理的时间内对该表达式进行类型检查

SwiftUI: The compiler is unable to type-check this expression in reasonable time

我想从 EKEvent 获取日历颜色。但我收到错误: 编译器无法在合理的时间内对该表达式进行类型检查;尝试将表达式分解为不同的子表达式 Rectangle().fill 导致错误。 我如何从 calendar.cgcolor 获取 Rectangle 的 UIColor?

           ForEach(0..<data.eventsByDay.prefix(4).count)
            {(section) in
              
                HStack(alignment: .bottom){
                    ForEach(0..<data.eventsByDay[section].prefix(3).count)
                    {(row) in
                        
                        Rectangle().fill(UIColor(cgcgolor: data.eventsByDay[section][row].calendar.cgcolor))
                        .frame(width: 3, height: 26, alignment: .leading)
                        .cornerRadius(1.5)
                        .padding(.bottom, 1.0)
                    }
             }

当 Xcode 无法确定错误的确切原因时会出现此错误。

我建议您根据错误进行以下说明

try breaking up the expression into distinct sub-expressions

您可以通过将视图的一部分移动到一个单独的函数或 View 中来做到这一点,但您也可以一个一个地注释掉块,直到您看到实际错误或直到它构建:在这种情况下,错误出现在注释行之一。


在他的例子中,你可以把两个ForEach都注释掉,并用常量替换它们:

//ForEach(0..<data.eventsByDay.prefix(4).count)
//{(section) in
    let section = 0
    HStack(alignment: .bottom){
//        ForEach(0..<data.eventsByDay[section].prefix(3).count)
//        {(row) in
            let row = 0
            Rectangle().fill(UIColor(cgcgolor: data.eventsByDay[section][row].calendar.cgcolor))
                .frame(width: 3, height: 26, alignment: .leading)
                .cornerRadius(1.5)
                .padding(.bottom, 1.0)
        }
    }
}

然后 Xcode 将能够告诉您您在 UIColor 初始值设定项中输入错误(cgColor 而不是 cgcgolor),并且 fill 使用 Color 而不是 UIColor - 第二个来自 UIKit 并且使用 SwiftUI 几乎永远不需要它。

所以固定变体看起来像:

ForEach(0..<data.eventsByDay.prefix(4).count)
{(section) in
    let section = 0
    HStack(alignment: .bottom){
        ForEach(0..<data.eventsByDay[section].prefix(3).count)
        {(row) in
            let row = 0
            Rectangle().fill(Color(data.eventsByDay[section][row].calendar.cgcolor))
                .frame(width: 3, height: 26, alignment: .leading)
                .cornerRadius(1.5)
                .padding(.bottom, 1.0)
        }
    }
}