首页 > 解决方案 > 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)
    }
}

编辑:修复了代码中的一个小错误 - 编译器错误仍然存​​在。

标签: swiftswiftuicompile-time-type-checking

解决方案


这种错误主要发生在您做错事但编译器无法说出它是什么时。有时,当只有一个很长的表达式并且编译器对此不满意时会发生这种情况,您只需将其分解为几个表达式,错误就会消失。

在这种情况下,我发现您的代码存在一个最有可能导致此问题的问题。我不确定是否还有更多(可能没有),但这是我找到的:

.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))

推荐阅读