Как устранить неоднозначность foreach l oop в Xcode с SwiftUI - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь создать шестиугольную сетку, используя swiftUI на Xcode. Для создания отдельных шестиугольников я использую foreach l oop. Однако я столкнулся с ошибкой при создании функции, которая создает столбец шестиугольников:

private func makeCol(C: Int, Bump:Int) -> some View {
        return ZStack {
            ForEach(-5...5, id: \.self) {Ynumber in                
                self.hexagon(
                    x: (ThreeRooted * self.L * Double(C)) + self.centerWidth,
                    y: (ThreeRooted * self.L * Double(Ynumber)) + self.centerHeight + (ThreeRootedOverTwo * self.L * Bump))
                    .stroke(Color.red, lineWidth: CGFloat(self.L/4.0))
            }
        }
    }

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

Чтобы обойти это, я выделил свои поля местоположения в отдельных переменных. Однако это привело к другой ошибке:

private func makeCol(C: Int, Bump:Int) -> some View {
        return ZStack {
            ForEach(-5...5, id: \.self) {Ynumber in
                let xPlot = (ThreeRooted * self.L * Double(C)) + self.centerWidth
                let yPlot = (ThreeRooted * self.L * Double(Ynumber)) + self.centerHeight + (ThreeRootedOverTwo * self.L * Bump)

                self.hexagon(
                    x: xPlot,
                    y: yPlot)
                    .stroke(Color.red, lineWidth: CGFloat(self.L/4.0))
            }
        }
    } 

Ошибка: невозможно определить тип возврата сложного замыкания; добавить явный тип для устранения неоднозначности.

Как мне дать этот l oop явный тип ?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

ForEach - это структура , которая вычисляет представления по требованию из базового набора идентифицированных данных, НЕ все oop.

Как создать гексагональную сетку? Ниже приведен один из возможных подходов, в котором я попытался показать вам, как использовать ForEach и декларативный синтаксис SwiftUI.

import SwiftUI

struct Hexagon: Shape {
    func path(in rect: CGRect) -> Path {
        Path { (path) in
            path.move(to: .init(x: rect.midX, y: rect.minY))
            path.addLine(to: .init(x: rect.maxX, y: (rect.minY + rect.midY) / 2 ))
            path.addLine(to: .init(x: rect.maxX, y: (rect.maxY + rect.midY) / 2 ))
            path.addLine(to: .init(x: rect.midX, y: rect.maxY))
            path.addLine(to: .init(x: rect.minX, y: (rect.maxY + rect.midY) / 2 ))
            path.addLine(to: .init(x: rect.minX, y: (rect.minY + rect.midY) / 2 ))
            path.closeSubpath()
        }
    }
}

struct ContentView: View {
    var body: some View {
        VStack(spacing: -10) {
            ForEach(0 ..< 3) { j in
                HStack(spacing: 5) {
                    ForEach(0 ..< 4) { i in
                        Hexagon()
                            .fill(Color.yellow)
                            .overlay(
                                Hexagon()
                                .stroke(Color.red, lineWidth: 5)
                            )
                            .frame(width: 50, height: 60)
                    }
                }
                HStack(spacing: 5) {
                    ForEach(0 ..< 3) { i in
                        Hexagon()
                            .stroke(Color.blue, lineWidth: 5)
                            .frame(width: 50, height: 60)
                    }
                }
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

и вот результат enter image description here

Здесь для простоты фиксированы интервалы и параметры кадра, вам лучше рассчитать правильные числа.

init(Range<Int>, content: (Int) -> Content)

Доступно, когда для параметра «Данные» задано значение «Диапазон», для параметра «Идентификатор» задано значение «Интервал», а содержимое соответствует представлению.

Вы пытались использовать

init(Data, id: KeyPath<Data.Element, ID>, content: (Data.Element) -> Content)

Доступно, когда Content соответствует View.

и, наконец, у нас нет никакой идеи, какой тип возвращает вашу функцию шестиугольника, это может быть Shape, но Shape является протоколом, и это может создать проблемы. Если это Shape, попробуйте определить тип возвращаемого значения как некоторый Shape.

Да, отчеты об ошибках компилятора все еще не очень удобны с SwiftUI

0 голосов
/ 14 февраля 2020

Как мне дать этому l oop явный тип?

ForEach(-5...5, id: \.self) { (Ynumber) -> _ExplicitType_ in
  ...
  return self.hexagon(
            ...
         )
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...