【问题标题】:How to pass variables functions in forEach loops如何在 forEach 循环中传递变量函数
【发布时间】:2020-02-22 15:05:44
【问题描述】:

目标:

我目前正在编写一些代码来创建六边形网格,每个六边形都单独用渐变着色。但是我对 swiftUI 很陌生,不完全理解为什么我的代码不起作用。

代码:

ForEach(0 ..< 11, id: \.self) { Xnum in
    ForEach(0 ..< 11, id: \.self) { Ynum in
        self.MyNewPath(in: CGRect(), Xcoord: Double(Xnum), Ycoord: Double(Ynum), Type: 1)
            .fill(RadialGradient(
                gradient: Gradient(colors: [Color.red, Color.blue]),
                center: .init(
                    x: self.gradientParametersX(Xpos: Double(Xnum)),
                    y: self.gradientParametersY(Ypos: Double(Ynum), Xpos: Double(Xnum))),
                startRadius: CGFloat(2.0),
                endRadius: CGFloat(70.0)))
            .gesture(
                TapGesture().onEnded {_ in
                    self.dataEditor(Xplace: Int(Xnum), Yplace: Int(Ynum))
                }
            )
    }
}

返回类型:

  • MyNewPath() - Path(六边形)
  • gradientParametersY() - CGFloat
  • gradientParametersY() - CGFloat

错误:

编译器无法在合理的时间内对该表达式进行类型检查;尝试将表达式分解为不同的子表达式

错误似乎集中在将XnumYnum 传递给函数gradientParametersX()gradientParametersY()

例如当我通过 7.0 和 0.0 时:

x: self.gradientParametersX(Xpos: Double(7.0)),
y: self.gradientParametersY(Ypos: Double(0.0), Xpos: Double(7.0))),

...没有错误。

【问题讨论】:

标签: swift swiftui xcode11


【解决方案1】:

尝试在单独的函数中单独创建网格项,如下所示(代码快照不可测试,所以对演示的想法很粗糙)

    ...
    ForEach(0 ..< 11, id: \.self) { Xnum in
        ForEach(0 ..< 11, id: \.self) { Ynum in
            self.createItem(for: Xnum, Ynum: Ynum)
        }
    }
    ...

private func createItem(for Xnum: Int, Ynum: Int) -> some View {
    self.MyNewPath(in: CGRect(), Xcoord: Double(Xnum), Ycoord: Double(Ynum), Type: 1)
        .fill(RadialGradient(
            gradient: Gradient(colors: [Color.red, Color.blue]),
            center: .init(
                x: self.gradientParametersX(Xpos: Double(Xnum)),
                y: self.gradientParametersY(Ypos: Double(Ynum), Xpos: Double(Xnum))),
            startRadius: CGFloat(2.0),
            endRadius: CGFloat(70.0)))
        .gesture(
            TapGesture().onEnded {_ in
                self.dataEditor(Xplace: Int(Xnum), Yplace: Int(Ynum))
            }
        )
}

【讨论】:

  • 谢谢@Asperi 这个答案是完美的。但是,我仍然对为什么编译器无法推断 Xnum 和 Ynum 的类型感到困惑。
【解决方案2】:

编辑:您的回答是否涉及 SwiftUI 而不仅仅是 Swift?如果是,请编辑您的问题,并查看其下方的 user3441734 评论。


编译器在推断XnumYnum 的类型时似乎遇到了麻烦。 您可能必须显式编写它们的类型。

你的 ForEach 语法看起来很奇怪,你试过了吗

for Xnum:Int in 0..<11
{
    for Ynum:Int in 0..<11
    {

    }
}

然后将 XnumYnum 转换为 Double

您也可以通过这种方式直接对双打进行 foreach :

for Xnum:Double in stride(from: 0, through: 10, by: 1.0)
{
    for Ynum:Double in stride(from: 0, through: 10, by: 1.0)
    {

    }
}

【讨论】:

    猜你喜欢
    • 2014-09-29
    • 2020-08-21
    • 2016-01-01
    • 2018-03-01
    • 2020-08-21
    • 2020-06-19
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多