swift - SwiftUI 中令人抓狂的错误似乎没有意义。编译器有错误吗?
问题描述
我正在尝试在 SwiftUI 中构建 Splendor Board 游戏的一个版本,纯粹是为了学习目的。我正在构建令牌堆栈视图,并且遇到了一个非常令人困惑的错误。每次我进行更改时,画布都会永远占用然后出现此错误:
编译器无法在合理的时间内对该表达式进行类型检查;尝试将表达式分解为不同的子表达式
从我可以看到我的代码没有错误并且风格合理(尽管如果可以改进,请随时提供反馈)。该错误似乎取决于第 11 行的 offset() 函数 - 如果我将其注释掉,错误就会消失,但无论如何,代码需要该偏移量才能工作。我不明白为什么会这样。
错误本身表明将代码分成更小的块 - 但它已经非常小了!
作为解释,TokenView 旨在构建一个带有宝石图像的代币——想想扑克筹码。TokenStackView 旨在构建一堆令牌视图,每个视图都比前一个稍微偏移,最后一个芯片稍微歪斜。'showImage' 布尔值是我试图让编译器更容易编译 - 但这并没有解决错误。
我的代码确实有一些修饰符使它看起来不错,适合框架等,但我已经把它们全部拿出来试图修复这个错误。
任何解决此问题的帮助将不胜感激!
import SwiftUI
struct TokenStackView: View {
var gemType: GemType
var gemsCount: Int
var body: some View {
ZStack{
ForEach (0..<gemsCount-1) { index in
TokenView(gemType: self.gemType, showImage: false)
//This line here causes the error:
.offset(x: CGFloat(index * offsetFactor), y: CGFloat(-index * offsetFactor))
}
TokenView(gemType: self.gemType, showImage: true)
}
}
//Control Panel
let offsetFactor: CGFloat = 10
}
struct TokenStackView_Previews: PreviewProvider {
static var previews: some View {
TokenStackView(gemType: .ruby, gemsCount: 5)
}
}
这是 TokenStackView.swift:
import SwiftUI
struct TokenView: View {
var gemType: GemType
var showImage: Bool
var body: some View {
ZStack{
Circle()
.stroke(self.gemType.secondaryColour(), lineWidth: lineWidth)
.offset(x: -offset, y: offset)
if showImage {
Image(self.gemType.rawValue + "-token")
.clipShape(Circle())
}
Circle()
.stroke(self.gemType.primaryColour() ,lineWidth: lineWidth)
}
.frame(width: frameWidthHeight, height: frameWidthHeight, alignment: .center)
}
let frameWidthHeight: CGFloat = 550
let lineWidth: CGFloat = 20
let offset: CGFloat = 10
}
struct TokenView_Previews: PreviewProvider {
static var previews: some View {
TokenView(gemType: .diamond, showImage: true)
}
}
编辑:修复了代码中的一个小错误 - 编译器错误仍然存在。
解决方案
这种错误主要发生在您做错事但编译器无法说出它是什么时。有时,当只有一个很长的表达式并且编译器对此不满意时会发生这种情况,您只需将其分解为几个表达式,错误就会消失。
在这种情况下,我发现您的代码存在一个最有可能导致此问题的问题。我不确定是否还有更多(可能没有),但这是我找到的:
.offset(x: index * offsetFactor, y: -index * offsetFactor)
index
并且offsetFactor
是 类型Int
。您应该简单地将它们包装在 aCGFloat
中以将它们转换为CGFloat
,因为.offset(x:y:)
方法接受 CGFloats,而不是 Ints:
.offset(x: CGFloat(index * offsetFactor), y: CGFloat(-index * offsetFactor))
推荐阅读
- javascript - 查找只有一个表情符号的字符串的函数
- parsing - 我在哪里可以获得 GNU Bison 3.5.4+ 的 Windows 可执行文件?
- c# - 删除列表视图中图像的蓝色背景
- spring-boot - Drools 7 - Timer Cron 无法停止从数据库加载的规则
- ios - setValue(value:forKey:) 在 Firebase Auth 中做了什么?
- javascript - 如何在 JavaScript 中的 Materializecss 中自动调整文本区域的大小
- sql - 在presto sql中使用正则表达式提取=和&之间的文本
- java - 如何在文本文件中写入多个 ArrayList
- android - 如何从一个 RecyclerView 获取数据并在另一个 Activity 的 RecyclerView 中显示
- neo4j - 无法使用 finally_consistent 设置创建全文搜索