如何在 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()
我有一个名为 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
:
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()