swiftui - 给出的错误消息:无法推断通用参数“数据”
问题描述
我已经尝试了很多事情,但似乎不断收到我无法删除的错误消息。下面列出了代码,我有以下问题:
- 错误在哪里?第二个 ForEach 语句没有错误,但第一个结果是“无法推断通用参数‘数据’”。
- 为什么我不能在这个块中使用“for”语句?当我这样做时,我收到一条错误消息
- 不预先定义 i 和 j 很奇怪,但是当我这样做时,我会收到错误消息。为什么?
- 我想制作各种(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
}
}
}
}
}
}
解决方案
您的代码将无法编译,因为您在闭包中添加了let
s 和var
s 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()
}
}
}
}
}
}
推荐阅读
- php - 使用 YouTube V3 API 回显视频 ID
- unit-testing - VS2017 无法使用 dotcover(测试无定论)
- botframework - activity.entites 不传递自定义对象
- html - 将项目放置在具有任意宽度但定义跨度的网格布局中
- symfony - Symfony 捆绑注册
- javascript - 维护实时 HTMLCollection 的性能成本是多少?
- android - 颤动AndroidManifest警告-当前最小值为1
- android - 在解析 XML 时,如何在 Android 中使用 XmlPullParser 正确处理命名空间?
- node.js - 如何使用 Node.js 读取大文件的一部分?
- javascript - 如何使用三个返回变量中的特定变量?