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

时间:2020-06-08 04:58:21

标签: ios swift swiftui

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

有许多图像需要设置为多个不同文本段的背景。我相信我可以通过使用字符串的前缀来实现正确的主意,但是似乎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 个答案:

答案 0 :(得分:0)

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

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(_:)构造函数需要一个String。