There are different algorithms for Element==CGPoint, Element==[CGPoint], Element==[AreaPoint], etc…
Your second suggestion work: protocol Inertial { func convexHull( _ t:AffineTransform? ) -> [CGPoint] func area( _ t:AffineTransform? ) -> CGFloat func firstOrderMomentums( _ t:AffineTransform? ) -> (x:CGFloat,y:CGFloat) func secondOrderMomentums( _ t:AffineTransform? ) -> (xx:CGFloat,xy:CGFloat,yy:CGFloat) } protocol InertialElement { static func convexHull( elements:[Self], _ t: AffineTransform?) -> [CGPoint] static func area( elements:[Self],_ t: AffineTransform?) -> CGFloat static func firstOrderMomentums( elements:[Self],_ t: AffineTransform?) -> (x: CGFloat, y: CGFloat) static func secondOrderMomentums( elements:[Self],_ t: AffineTransform?) -> (xx: CGFloat, xy: CGFloat, yy: CGFloat) } extension Array : Inertial where Element : InertialElement { func convexHull(_ t: AffineTransform?) -> [CGPoint] { return Element.convexHull(elements: self, t) } func area(_ t: AffineTransform?) -> CGFloat { return Element.area(elements: self, t) } func firstOrderMomentums(_ t: AffineTransform?) -> (x: CGFloat, y: CGFloat) { return Element.firstOrderMomentums(elements: self, t) } func secondOrderMomentums(_ t: AffineTransform?) -> (xx: CGFloat, xy: CGFloat, yy: CGFloat) { return Element.secondOrderMomentums(elements: self, t) } } and than: extension CGPoint : InertialElement { static func convexHull( elements:[CGPoint], _ t: AffineTransform?) -> [CGPoint] { return ConvexHull.convexHull( points:elements ).map { $0 * t } } static func area( elements:[CGPoint],_ t: AffineTransform?) -> CGFloat { return InertialUti.area( polig: elements,t ) } static func firstOrderMomentums( elements:[CGPoint],_ t: AffineTransform?) -> (x: CGFloat, y: CGFloat) { return InertialUti.firstOrderMomentums( polig:elements,t ) } static func secondOrderMomentums( elements:[CGPoint],_ t: AffineTransform?) -> (xx: CGFloat, xy: CGFloat, yy: CGFloat) { return InertialUti.secondOrderMomentums( polig:elements,t ) } } extension Array : InertialElement where Element == CGPoint { ... } extension AreaPoint : InertialElement { ... } etc... Thanks, Slava. :-) Antonino > Il giorno 28 nov 2017, alle ore 23:17, Slava Pestov <spes...@apple.com> ha > scritto: > > Hi Antonio, > > This is explicitly mentioned in the original proposal. We do not allow > multiple conditional conformances to be defined for the same type. Instead, > is it possible to express your conformance as follows? > > extension Array : Intertial where Element : Inertial { … } > > Or do you really need different algorithms for Element == CGPoint and Element > == [CGPoint], with no conformance for Element == [[CGPoint]], etc? > > If the latter, you could possibly have an InertialElement protocol or similar > that CGPoint and [CGPoint] conform to, with a second level of dispatch to > pick between the two cases. > > Slava >
_______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users