如何在 Swift 中访问 CGPoints 数组中所有元素的序列

How to access a sequence of all elements in Array of CGPoints in Swift

我有一个名为 Trapezoid 的数组,其中包含从 0 到 n 的 CGPoint。如何获取此数组的所有元素并将它们提供给 For-In 循环?

在我的代码中,我在第一行有一个错误:无法将类型“[Trapezoid].Type”(又名 'Array<[Trapezoid]>.Type')的值转换为指定类型“[CGPoint]”。

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()
    }
}
}

不知道你是如何设置梯形或CGPoint的,很难完全回答你的问题。但是,如果 Trapezoid 是一个 CGPoints 数组,你可以尝试:

for(int i = 0; i < Trapezoid.length(); i++){
    CGPoint[i] = Trapezoid[i]; 
}

或者输入您需要做的任何事情,以便在两种类型之间进行转换。

一个梯形在任何意义上都没有多个CGPoints。它包含 一个 CGPoint,您的 controlPointCoordinates 将其包裹在一个数组中(没有明显原因)。

给定一个梯形数组,您可以通过其 controlPointCoordinates:

映射将其映射到 CGPoint 的 个数组
let printedArray: [[CGPoint]] = myTrapezoidArray.map {[=10=].controlPointCoordinates()}

然后您可以展平 CGPoint 数组的数组以获得 CGPoint 数组:

let realPrintedArray = printedArray.flatten()

然后您可以使用 for...in 循环遍历展平的数组,并在每次迭代时获得一个 CGPoint。

但实际上,如果 controlPointCoordinates 返回一个 CGPoint 而不是一个数组不是更简单吗?

假设您有一些数组,该数组是 Trapezoid 的数组,您想将其转换为 CGPoint 的数组?

var someArrayOfTrapezoids = [Trapezoid]()
// add some Trapezoid values

假设 controlPointCoordinates returns 是一个包含单个 CGPoint 的数组,您可以使用以下任一方法将其转换为 CGPoint 的数组:

let printedArray = someArrayOfTrapezoids.map { [=11=].controlPointCoordinates()[0] }

let printedArray = someArrayOfTrapezoids.flatMap { [=12=].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 { [=14=].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()