@ Мориц Отличный ответ! Чтобы найти решение, подобное Swift, я наткнулся на подход в этом post и реализовал расширение CGPath, подобное этому, чтобы получить точки из пути:
extension CGPath {
func points() -> [CGPoint]
{
var bezierPoints = [CGPoint]()
self.forEach({ (element: CGPathElement) in
let numberOfPoints: Int = {
switch element.type {
case .MoveToPoint, .AddLineToPoint: // contains 1 point
return 1
case .AddQuadCurveToPoint: // contains 2 points
return 2
case .AddCurveToPoint: // contains 3 points
return 3
case .CloseSubpath:
return 0
}
}()
for index in 0..<numberOfPoints {
let point = element.points[index]
bezierPoints.append(point)
}
})
return bezierPoints
}
func forEach(@noescape body: @convention(block) (CGPathElement) -> Void) {
typealias Body = @convention(block) (CGPathElement) -> Void
func callback(info: UnsafeMutablePointer<Void>, element: UnsafePointer<CGPathElement>) {
let body = unsafeBitCast(info, Body.self)
body(element.memory)
}
let unsafeBody = unsafeBitCast(body, UnsafeMutablePointer<Void>.self)
CGPathApply(self, unsafeBody, callback)
}
}