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

Posted

技术标签:

【中文标题】编译器无法在 SwiftUI 中的合理时间内对该表达式进行类型检查?【英文标题】:The compiler is unable to type-check this expression in a reasonable time in SwiftUI? 【发布时间】:2020-06-08 04:58:21 【问题描述】:

我有一行代码将 Text 的背景设置为通过查找字符串的前三个字母来获取的图像。由于某种原因,这不会运行并不断给我上面的错误。关于如何解决此问题的任何想法?

有很多图像需要设置为多段不同文本的背景。我相信通过使用字符串的前缀我有正确的想法,但似乎 Xcode 遇到了困难/不会运行它。

很确定这条特定的线路给我带来了问题,但希望得到一些反馈。 .background(Image(colorOption.prefix(3)).resizable())

import SwiftUI

struct ColorView: View 
    // @ObservedObject var survey = Survey()
    @ObservedObject var api = ColorAPIRequest(survey: DataStore.instance.currentSurvey!)
    @State var showingConfirmation = true
    @State var showingColorView = false
    @State var tempSelection = ""


    @EnvironmentObject var survey: Survey

    //@EnvironmentObject var api: APIRequest

    var colorOptionsGrid: [[String]] 
        var result: [[String]] = [[]]
        let optionsPerRow = 4
        api.colorOptions.dropFirst().forEach  colorOption in
            if result.last!.count == optionsPerRow  result.append([]) 
            result[result.count - 1].append(colorOption)
        
        return result
    

    var body: some View 
        VStack 
            Text("Select Tape Color")
                .font(.system(size:70))
                .bold()
                .padding(.top, 20)

            NavigationLink("", destination: LengthView(), isActive: $showingColorView)

            HStack 

                List 
                    ForEach(colorOptionsGrid, id: \.self)  colorOptionRow in
                        HStack 
                            ForEach(colorOptionRow, id: \.self)  colorOption in

                                Button(action: 

                                    // self.survey.length = lengthOption
                                    self.tempSelection = colorOption
                                    self.showingConfirmation = false

                                

                                ) 


                                    ZStack 
                                        Color.clear
                                        Text(colorOption.prefix(3))
                                            .font(.title)
                                            .foregroundColor(self.tempSelection == colorOption ? Color.white : Color.black)
                                            .frame(width: 200, height: 100)
                                            .background(Image(colorOption.prefix(3)).resizable())
                                     //Image(colorOption.prefix(3)).resizable()
                                    

                                .listRowBackground(self.tempSelection == colorOption ? Color.pink : Color.white)
                                    .multilineTextAlignment(.center)
                            
                        


                    

                .buttonStyle(PlainButtonStyle())
            


            Button(action: 
                self.survey.color = self.tempSelection
                self.showingColorView = true
                self.showingConfirmation = true

            ) 
                Text("Press to confirm \(tempSelection)")
                    .bold()
                    .padding(50)
                    .background(Color.pink)
                    .foregroundColor(.white)
                    .font(.system(size:40))
                    .cornerRadius(90)
            .isHidden(showingConfirmation)
                .padding(.bottom, 50)
        
    


【问题讨论】:

【参考方案1】:

当编译器告诉你分解表达式时,它实际上给出了一个相当不错的建议。最简单的方法是将背景图像提取到一个单独的函数中,如下所示:

func backgroundImage(for colorOption: String) -> some View 
    Image(String(colorOption.prefix(3))).resizable()

然后将调用替换为

.background(Image(colorOption.prefix(3)).resizable())

.background(self.backgroundImage(for: colorOption))

还请注意,我将colorOption.prefix(3) 包装在String 构造函数中,仅仅是因为.prefix(_:) 返回一个Substring,但Image(_:) 构造函数需要一个字符串。

【讨论】:

感谢您的建议。不幸的是,我尝试更换它,但仍然遇到同样的错误。 无论哪种方式,我建议您继续我在原始帖子中的建议,将代码分解为更小的部分,作为函数或计算属性,或单独的 View 结构

以上是关于编译器无法在 SwiftUI 中的合理时间内对该表达式进行类型检查?的主要内容,如果未能解决你的问题,请参考以下文章

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

无法在合理的时间内对该表达式进行类型检查 - ForEach SwiftUI

Xcode 12 中的类型检查错误:“编译器无法在合理的时间内对该表达式进行类型检查”

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

无法编译 SwiftUI ForEach 表

如何使用 SwiftUI 交替行?