[swift-users] Experimenting with conditional conformances

Slava Pestov spestov at apple.com
Tue Nov 28 16:17:35 CST 2017


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 at 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 at swift.org
> https://lists.swift.org/mailman/listinfo/swift-users

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20171128/9211fc50/attachment.html>


More information about the swift-users mailing list