编译器无法在 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