[swift-evolution] PITCH: Return a subclass for a protocol method without the need for an associatedtype

Vladimir.S svabox at gmail.com
Wed Aug 17 12:18:04 CDT 2016


Although I see your point, and probably support, nothing prevents you from 
actually return Circle from make() but have return type defined as Shape.

Actually you can even have both Shape and Circle returning make() if you 
fill this will be handy for you:

class Shape {}

// The protocol
protocol MyShapeProtocol {
// returns Shape
func make() -> Shape?
}

// Circle inherits from Shape
class Circle : Shape {}

// CircleMaker conforms to the MyShapeProtocol
class CircleMaker : MyShapeProtocol {
// CircleMaker wants to return Circle which is a type of Shape
func make()->Shape? {
     return make() as Circle?
}

func make()->Circle? {
   return Circle()
}
}


var cm = CircleMaker()
var x : Circle? = cm.make()
print(type(of: x)) // Optional<Circle>

var p = cm as MyShapeProtocol
print(type(of: p.make())) // Optional<Shape>


But yes, strictly speaking 'make()->Circle?' conforms to protocol 
requirement 'make()->Shape?', it does returns 'Shape?', so I believe this 
should be treated as conformance to MyShapeProtocol protocol.


On 17.08.2016 10:09, Sitton, Yogev via swift-evolution wrote:
> Hi,
>
> I raised this issue a few months back and discussion has died out since.
> I’m raising this again to see if there are any objections before I submit a
> proposal.
>
>
>
> I have a class that conforms to a protocol which declares a method with a
> specific return type.
> In case I want to return a subclass of the return type I am forced to use
> anassociatedtype.
> This feels like a hack.
>
> *Example:*
>
> // The protocol
> protocol MyShapeProtocol {
> // returns Shape
> func make() -> Shape?
> }
>
> // Circle inherits from Shape
> class Circle : Shape {}
>
> // CircleMaker conforms to the MyShapeProtocol
> class CircleMaker : MyShapeProtocol {
> // CircleMaker wants to return Circle which is a type of Shape
> func make() ->Circle? {
> return Circle()
> }
> }
>
> This will not work.
> For that to work I’ll need to use toe associatedtype “hack”:
>
> *Example:*
> protocol MyShapeProtocol {
> associatedtype ShapeReturnType : Shape
> func make() -> ShapeReturnType?
> }
>
> class Circle : Shape {}
>
> class CircleMaker : MyShapeProtocol{
> func make() ->Circle? {
> return Circle()
> }
> }
>
> What I’m suggesting is to allow to return a subclass for a protocol method
> without the need for an associatedtype.
>
> Any reason why not?
>
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
>


More information about the swift-evolution mailing list