我有一个名为Trapezoid的数组,其中包含从0到n的CGPoints。如何获取此数组的所有元素并将它们提供给For-In循环?
在我的代码中,我在第一行有一个错误:无法将类型'[Trapezoid] .Type'(又名'Array&lt; [Trapezoid]&gt; .Type')的值转换为指定类型'[CGPoint]'。< / p>
let printedArray: [CGPoint] = [Trapezoid]
for (index, calculatedPoint) in printedArray.enumerate() {
let pointElement = NSXMLElement(name: "point")
let xx = calculatedPoint.x
let yy = calculatedPoint.y
pointElement.attributes = [
xmlAttributeWithName("id", value: "\(index)"),
xmlAttributeWithName("x", value: "\(xx)"),
xmlAttributeWithName("y", value: "\(yy)") ]
}
//梯形声明
enum Trapezoid {
case vertexOne(point: CGPoint)
case vertexTwo(point: CGPoint)
case vertexThree(point: CGPoint)
case vertexFour(point: CGPoint)
func controlPointCoordinates() -> [CGPoint] {
switch self {
case .vertexOne(let point): return [point]
case .vertexTwo(let point): return [point]
case .vertexThree(let point): return [point]
case .vertexFour(let point): return [point]
}
}
func segmentedPath(path: CGMutablePath) {
switch self {
case .vertexOne(let point): CGPathMoveToPoint(path, nil, point.x, point.y)
case .vertexTwo(let point): CGPathAddLineToPoint(path, nil, point.x, point.y)
case .vertexThree(let point): CGPathAddLineToPoint(path, nil, point.x, point.y)
case .vertexFour(let point): CGPathAddLineToPoint(path, nil, point.x, point.y)
CGPathCloseSubpath(path)
NSColor.darkGrayColor().setStroke()
}
}
}
答案 0 :(得分:3)
据推测,您有一些数组Trapezoid
要转换为CGPoint
数组?
var someArrayOfTrapezoids = [Trapezoid]()
// add some Trapezoid values
鉴于controlPointCoordinates
返回一个包含CGPoint
个数组的数组,您可以使用以下任一项将其转换为CGPoint
数组:
let printedArray = someArrayOfTrapezoids.map { $0.controlPointCoordinates()[0] }
或
let printedArray = someArrayOfTrapezoids.flatMap { $0.controlPointCoordinates() }
虽然这里有一些不和谐,因为一个名为Trapezoid
的类型听起来应该是一个完整的梯形,但它只是一个梯形的一个坐标。我要么将它重新定义为单点,例如
enum TrapezoidPoint {
case vertexOne(point: CGPoint)
case vertexTwo(point: CGPoint)
case vertexThree(point: CGPoint)
case vertexFour(point: CGPoint)
func controlPointCoordinate() -> CGPoint { // note, not [CGPoint], and not `controlPointCoordinates`, but rather `controlPointCoordinate`
switch self {
case .vertexOne(let point): return point
case .vertexTwo(let point): return point
case .vertexThree(let point): return point
case .vertexFour(let point): return point
}
}
...
}
在这种情况下你会这样做:
let printedArray = arrayOfTrapezoidPoints.map { $0.controlPointCoordinate() } // the `[0]` is no longer needed
或者将其定义为全部四个点:
struct Trapezoid {
let vertexOne: CGPoint
let vertexTwo: CGPoint
let vertexThree: CGPoint
let vertexFour: CGPoint
func controlPointCoordinates() -> [CGPoint] {
return [vertexOne, vertexTwo, vertexThree, vertexFour]
}
...
}
然后你可以这样做:
let printedArray = someSingleTrapezoidWithFourPoints.controlPointCoordinates()
答案 1 :(得分:1)
Trapezoid在任何意义上都没有多个CGPoints。它包含一个 CGPoint,你的controlPointCoordinates
包含在一个数组中(没有明显的原因)。
给定一个Trapezoid数组,你可以通过它的controlPointCoordinates
映射将它映射到CGPoint的数组数组:
let printedArray: [[CGPoint]] = myTrapezoidArray.map {$0.controlPointCoordinates()}
然后你可以压平 CGPoint数组数组以获得CGPoint数组:
let realPrintedArray = printedArray.flatten()
然后,您可以使用for...in
遍历展平数组,并在每次迭代时获得CGPoint。
但实际上,如果controlPointCoordinates
返回CGPoint而不是数组,那会不会更简单?
答案 2 :(得分:-3)
如果不知道如何设置Trapezoid或CGPoint,很难完全回答您的问题。但是,如果Trapezoid是一个CGPoints数组,您可以尝试:
for(int i = 0; i < Trapezoid.length(); i++){
CGPoint[i] = Trapezoid[i];
}
或者为了在两种类型之间进行转换而放入您需要做的任何事情。