首页 > 解决方案 > 给出的错误消息:无法推断通用参数“数据”

问题描述

我已经尝试了很多事情,但似乎不断收到我无法删除的错误消息。下面列出了代码,我有以下问题:

  1. 错误在哪里?第二个 ForEach 语句没有错误,但第一个结果是“无法推断通用参数‘数据’”。
  2. 为什么我不能在这个块中使用“for”语句?当我这样做时,我收到一条错误消息
  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
                    }

                }
            }
        }
    }
}

标签: swiftui

解决方案


您的代码将无法编译,因为您在闭包中添加了lets 和vars body,编译器期望在其中添加 some View。您可以简单地将 vars 移动到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()
                    }
                }
            }
        }
    }
}

推荐阅读