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

时间:2016-08-03 16:43:21

标签: arrays macos swift2

我有一个名为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()
    }
}
}

3 个答案:

答案 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]; 
}

或者为了在两种类型之间进行转换而放入您需要做的任何事情。