Как передать функции переменных в циклы forEach - PullRequest
2 голосов
/ 22 февраля 2020

Цель:

В настоящее время я работаю над некоторым кодом для создания сетки шестиугольников, каждый из которых окрашен градиентом в отдельности. Однако я довольно новичок в 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

Ошибка:

Компилятор не может проверить это выражение в разумные сроки; попробуйте разбить выражение на отдельные подвыражения

Ошибка, по-видимому, связана с передачей 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))),

... ошибки нет.

Ответы [ 2 ]

3 голосов
/ 22 февраля 2020

Попробуйте разделить создание элементов сетки в отдельной функции, как показано ниже (моментальный снимок кода не тестируется, поэтому просто доработайте демонстрационную идею)

    ...
    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))
            }
        )
}
0 голосов
/ 22 февраля 2020

РЕДАКТИРОВАТЬ: Ваш ответ касается 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)
    {

    }
}
...