2016-12-31 2 views
0

CGPoint 배열을 취하여 폴리 라인의 끝점으로 취급하고 중간 지점을 Catmull- Rom smoothing을 사용하여 이러한 점들을 통과하는 곡선의 근사값을 만듭니다.[CGPoint]에서만 작동하도록 배열에 제한된 확장을 만들 수 있습니까?

함수는 전역 함수로 정의 할 수 있습니다 :

func smoothPoints(array: [CGPoint], granularity: Int = 4) -> [CGPoint] { 
    return [CGPoint]() //Placeholder code for actual implementation 
    } 

하지만 그것은 단지의 배열에 작동되도록 Array 종류에 제약 확장으로 정의 할 수 있도록하고 싶습니다 CGPoint s. 그게 가능하니?

Swift 3에서 찾을 수 있었던 제한적인 확장의 유일한 예는 배열 요소를 특정 데이터 (Struct) 유형이 아닌 프로토콜을 준수하는 객체로 제한합니다.

extension Array where Element: CGPoint { 
func smoothPoints(granularity: Int = 4) -> [CGPoint] { 
    } 
} 

을하지만 그것은 나에게 오류 "유형을 '요소'가 아닌 프로토콜 유형 'CGPoint'로 제한"제공 :

내가 같은 것을 할 수있을 것처럼 보인다.

선언

extension Array<CGPoint> 

... 중 하나가 작동하지 않습니다.

특정 유형의 배열에서만 작동하는 Array 클래스의 확장을 정의 할 수있는 것처럼 보이지만이를 수행하는 방법을 알 수는 없습니다.

제가 스위프트 3에서 가능한 것을 시도하고 있습니까, 아니면 전 세계적인 기능을 고수하고 있습니까?

+1

관련을 : [스위프트에 where 절을 사용하여 배열 유형을 확장 (http://stackoverflow.com/ q/31806324/2976878), [Swift에서 특정 유형의 배열을 확장하는 방법은 무엇입니까?] (http://stackoverflow.com/q/31842337/2976878). 가장 간단한 해결책은'Iterator.Element == CGPoint' 제약 조건 대신'Collection'을 확장하는 것입니다. – Hamish

+0

구현이 O (1) 색인에 의존하는 경우에는 대신 'RandomAccessCollection'을 확장해야합니다. – Hamish

답변

1

당신은 당신이 필요로하고 CGPoint가 준수해야하는 기능 노출하는 프로토콜로 제한 할 수있다 :

protocol Coordinates { 
    var x: CGFloat { get } 
    var y: CGFloat { get } 
} 

extension Array where Element: Coordinates { 
    func smoothPoints(granularity: Int = 4) -> [Element] { 
     return [] //Placeholder code for actual implementation 
    } 
} 

extension CGPoint: Coordinates {} 

let test: [CGPoint] = [CGPoint(x: 10, y: 20)] 
test.smoothPoints() // returns an Array<CGPoint>