Сообщение об ошибке: Общий параметр «Данные» не может быть выведен - PullRequest
0 голосов
/ 07 октября 2019

Я пробовал много вещей, но, кажется, получаю непрерывные сообщения об ошибках, которые я не могу удалить. Код указан ниже, и у меня есть следующие вопросы:

  1. Где ошибка? Второй оператор ForEach не имеет ошибок, но первые результаты в «Универсальный параметр« Данные »не могут быть выведены».
  2. Почему я не могу использовать оператор «для» в этом блоке? Когда я это делаю, я получаю сообщение об ошибке
  3. Странно не определять i и j заранее, но когда я это делаю, я получаю сообщения об ошибках. Почему?
  4. Я хотел бы сделать различные (8) сегменты круга, которые нарисованы кнопками. Я нашел ссылки в более старых версиях Swift (см. Прокомментированные строки ниже), но как мне их создать в SwiftUI?

Любая помощь для этого новичка будет высоко оценена.

struct ContentView: View {

    static let segmentCount = 4
    static let circleCount = 2

    var body: some View {

        let r = CGFloat(75.0)
        let center_x = CGFloat(150.0)
        let center_y = CGFloat(150.0)
        var arc_start = CGFloat(45.0 * CGFloat(Double.pi) / 180.0)

        let arc_length = CGFloat(90.0 * CGFloat(Double.pi) / 180.0)
        var arc_width = CGFloat(25.0)
        let line0Target_x = center_x + r * CGFloat(cos(Double(arc_start)))
        let line0Target_y = center_y + r * CGFloat(sin(Double(arc_start)))
        let line1Target_x = center_x + (r + arc_width) * CGFloat(cos(Double(arc_start + arc_length)))
        let line1Target_y = center_x + (r + arc_width) * CGFloat(sin(Double(arc_start + arc_length)))

        ZStack {
            ForEach(1..<ContentView.circleCount){ j in
                r = CGFloat(25.0 + CGFloat((j) - 1.0) * 25.0)
                ForEach(1..<ContentView.segmentCount){ i in
                    Path { path in
                        arc_start = CGFloat((45.0 + (CGFloat(i) - 1.0) * 90.0)) * CGFloat(Double.pi) / 180.0
                        path.move(to: CGPoint(x: line0Target_x, y: line0Target_y))
                        path.addArc(center: CGPoint(x: center_x, y: center_y), radius: r, startAngle: Angle(radians: Double(arc_start)), endAngle: Angle(radians: Double(arc_start + arc_length)), clockwise: false)
                        path.addLine(to: CGPoint(x: line1Target_x, y: line1Target_y))
                        path.addArc(center: CGPoint(x: center_x, y: center_y), radius: (r + arc_width), startAngle: Angle(radians: Double(arc_start + arc_length)), endAngle: Angle(radians: Double(arc_start)), clockwise: true)
                        path.addLine(to: CGPoint(x: line0Target_x, y: line0Target_y))
                        path.closeSubpath()

//                        let shapeLayer = CAShapeLayer()
//                        shapeLayer.strokeColor = UIColor.red.cgColor
//                        shapeLayer.fillColor = UIColor.blue.cgColor
//                        shapeLayer.path = path.cgPath
                    }

                }
            }
        }
    }
}

1 Ответ

0 голосов
/ 07 октября 2019

Ваш код не будет компилироваться, потому что вы добавляете let s и var s в закрытие body, где компилятор ожидает немного View. Вы можете просто переместить ваши переменные внутри Path замыкания (или вы можете сделать некоторые функции для его вычисления):

struct ContentView: View {
    static let segmentCount = 4
    static let circleCount = 2

    var body: some View {
        ZStack {
            ForEach(1..<ContentView.circleCount){ j in
                ForEach(1..<ContentView.segmentCount){ i in
                    Path { path in
                        let r = CGFloat(25.0 + (CGFloat(j) - 1.0) * 25.0)
                        let center_x = CGFloat(150.0)
                        let center_y = CGFloat(150.0)
                        var arc_start = CGFloat(45.0 * CGFloat(Double.pi) / 180.0)

                        let arc_length = CGFloat(90.0 * CGFloat(Double.pi) / 180.0)
                        var arc_width = CGFloat(25.0)
                        let line0Target_x = center_x + r * CGFloat(cos(Double(arc_start)))
                        let line0Target_y = center_y + r * CGFloat(sin(Double(arc_start)))
                        let line1Target_x = center_x + (r + arc_width) * CGFloat(cos(Double(arc_start + arc_length)))
                        let line1Target_y = center_x + (r + arc_width) * CGFloat(sin(Double(arc_start + arc_length)))

                        arc_start = CGFloat((45.0 + (CGFloat(i) - 1.0) * 90.0)) * CGFloat(Double.pi) / 180.0
                        path.move(to: CGPoint(x: line0Target_x, y: line0Target_y))
                        path.addArc(center: CGPoint(x: center_x, y: center_y), radius: r, startAngle: Angle(radians: Double(arc_start)), endAngle: Angle(radians: Double(arc_start + arc_length)), clockwise: false)
                        path.addLine(to: CGPoint(x: line1Target_x, y: line1Target_y))
                        path.addArc(center: CGPoint(x: center_x, y: center_y), radius: (r + arc_width), startAngle: Angle(radians: Double(arc_start + arc_length)), endAngle: Angle(radians: Double(arc_start)), clockwise: true)
                        path.addLine(to: CGPoint(x: line0Target_x, y: line0Target_y))
                        path.closeSubpath()
                    }
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...