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

> On Nov 28, 2017, at 12:31 PM, Antonino Ficarra via swift-users 
> <swift-users@swift.org> wrote:
> 
> I’have a protocol:
> 
> 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)
> }
> 
> I make [CPoint] (a poligon) conforms to the protocol:
> 
> extension Array : Inertial where Element == CGPoint {
>     func convexHull(_ t: AffineTransform?) -> [CGPoint] {
>         return ConvexHull.convexHull( points:self ).map { $0 * t }
>     }
>     
>     func area(_ t: AffineTransform?) -> CGFloat {
>         return InertialUti.area( polig: self,t )
>     }
>     
>     func firstOrderMomentums(_ t: AffineTransform?) -> (x: CGFloat, y: 
> CGFloat) {
>         return InertialUti.firstOrderMomentums( polig:self,t )
>     }
>     
>     func secondOrderMomentums(_ t: AffineTransform?) -> (xx: CGFloat, xy: 
> CGFloat, yy: CGFloat) {
>         return InertialUti.secondOrderMomentums( polig:self,t )
>     }
> }
> 
> 
> and work like a charm.
> 
> Then I try to make [[CPoint]] (an array of poligons) conforms to the same 
> protocol:
> 
> extension Array : Inertial where Element == [CGPoint] {
>     var allVertexs : [CGPoint] {
>         return flatMap({$0})
>     }
>     
>     func convexHull(_ t: AffineTransform?) -> [CGPoint] {
>         return ConvexHull.convexHull( points:allVertexs ).map { $0 * t }
>     }
>     
>     func area(_ t: AffineTransform?) -> CGFloat {
>         return InertialUti.area( poligs: self,t )
>     }
>     
>     func firstOrderMomentums(_ t: AffineTransform?) -> (x: CGFloat, y: 
> CGFloat) {
>         return InertialUti.firstOrderMomentums( poligs:self,t )
>     }
>     
>     func secondOrderMomentums(_ t: AffineTransform?) -> (xx: CGFloat, xy: 
> CGFloat, yy: CGFloat) {
>         return InertialUti.secondOrderMomentums( poligs:self,t )
>     }
> }
> 
> but this isn’t permitted: Redundant conformance of 'Array<Element>' to 
> protocol ‘Inertial’ !
> 
> I think it's a severe limitation: array with different element’s type (i.e. 
> different specializations of the same generic type) should be treated as 
> distinct types and not as the same type.
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> _______________________________________________
> swift-users mailing list
> swift-users@swift.org
> https://lists.swift.org/mailman/listinfo/swift-users

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to