微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SwiftUI中令人发指的错误似乎没有意义编译器中有错误吗?

如何解决SwiftUI中令人发指的错误似乎没有意义编译器中有错误吗?

我正试图纯粹出于学习目的在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)

indexoffsetFactor的类型为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一起编译

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。