如何在 forEach 循环中传递变量函数
How to pass variables functions in forEach loops
目标:
我目前正在编写一些代码来创建六边形网格,每个六边形都单独用渐变着色。但是我对 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))
}
)
}
}
Return 类型:
MyNewPath()
- Path
(六边形)
gradientParametersY()
- CGFloat
gradientParametersY()
- CGFloat
错误:
编译器无法在合理的时间内对该表达式进行类型检查;尝试将表达式分解为不同的子表达式
错误似乎集中在将 Xnum
和 Ynum
传递给函数 gradientParametersX()
和 gradientParametersY()
。
当我通过 7.0 和 0.0 例如:
x: self.gradientParametersX(Xpos: Double(7.0)),
y: self.gradientParametersY(Ypos: Double(0.0), Xpos: Double(7.0))),
...没有错误。
尝试在单独的函数中单独创建网格项,如下所示(代码快照不可测试,所以只是草率地演示想法)
...
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))
}
)
}
编辑: 您的答案是否涉及 SwiftUI 而不仅仅是 Swift?如果是,请编辑您的问题,并查看其下方的 user3441734 评论。
编译器在推导 Xnum
和 Ynum
的类型时似乎有问题。
您可能必须明确地写出它们的类型。
你的 ForEach 语法看起来很奇怪,你试过了吗
for Xnum:Int in 0..<11
{
for Ynum:Int in 0..<11
{
}
}
然后将 Xnum
和 Ynum
转换为 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)
{
}
}
目标:
我目前正在编写一些代码来创建六边形网格,每个六边形都单独用渐变着色。但是我对 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))
}
)
}
}
Return 类型:
MyNewPath()
-Path
(六边形)gradientParametersY()
-CGFloat
gradientParametersY()
-CGFloat
错误:
编译器无法在合理的时间内对该表达式进行类型检查;尝试将表达式分解为不同的子表达式
错误似乎集中在将 Xnum
和 Ynum
传递给函数 gradientParametersX()
和 gradientParametersY()
。
当我通过 7.0 和 0.0 例如:
x: self.gradientParametersX(Xpos: Double(7.0)),
y: self.gradientParametersY(Ypos: Double(0.0), Xpos: Double(7.0))),
...没有错误。
尝试在单独的函数中单独创建网格项,如下所示(代码快照不可测试,所以只是草率地演示想法)
...
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))
}
)
}
编辑: 您的答案是否涉及 SwiftUI 而不仅仅是 Swift?如果是,请编辑您的问题,并查看其下方的 user3441734 评论。
编译器在推导 Xnum
和 Ynum
的类型时似乎有问题。
您可能必须明确地写出它们的类型。
你的 ForEach 语法看起来很奇怪,你试过了吗
for Xnum:Int in 0..<11
{
for Ynum:Int in 0..<11
{
}
}
然后将 Xnum
和 Ynum
转换为 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)
{
}
}