问题描述
我正试图纯粹出于学习目的在SwiftUI中构建Splendor Board游戏的版本。我正在构建令牌堆栈视图,并且遇到了一个真正令人困惑的错误。每次我进行更改时,画布将永远占据一席之地,然后出现此错误:
编译器无法合理地对该表达式进行类型检查 时间;尝试将表达式分成不同的子表达式
据我所见,我的代码无错误且样式合理(尽管可以改进,请随时提供反馈)。该错误似乎取决于第11行的offset()函数-如果我将其注释掉,该错误就会消失,但是无论如何,代码都需要该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
。您应该只将它们包装在CGFloat
中以将它们转换为CGFloat
,因为.offset(x:y:)
方法接受CGFloat,而不接受Ints:
.offset(x: CGFloat(index * offsetFactor),y: CGFloat(-index * offsetFactor))
,
以下变体编译良好。经过Xcode 12测试
TokenView(gemType: self.gemType,showImage: false)
.offset(x: CGFloat(index) * self.offsetFactor,y: CGFloat(-index) * self.offsetFactor)
更新:通过更改为在self
中使用self.offsetFactor
使其也可以与Xcode 11.2一起编译