Hi Lincoln,

This is a known issue with ‘super’ method calls: 
https://bugs.swift.org/browse/SR-1736 <https://bugs.swift.org/browse/SR-1736>

A workaround is to cast the result of the supermethod call to Self explicitly:

let copied = super.copy() as! Self

Slava

> On Aug 10, 2017, at 8:16 PM, 吴君恺 via swift-users <swift-users@swift.org> 
> wrote:
> 
> Hi all,
> 
> here is the scenario, I want to implement a Copying protocol which can be 
> used homogeneously
> 
> protocol Copying {
>     func copy() -> Self
> }
> 
> Because this protocol contains neither associated-type-requirements or 
> self-requirements(requiring a method returning Self is different), it can 
> surely be used homogeneously.
> 
> let objects: [Copying] = ....
> for copyable in objects {
>     .....
> }
> 
> It will work if I make one of my base class conform to Copying
> 
> class Shape: Copying {
>     var color: UIColor?
> 
>     required init() {}
>     
>     func copy() -> Self {
>         let copied = type(of: self).init()
>         copied.color = color
>         return copied
>     }
> }
> 
> The implementation of `copy` above is forced by compiler to avoid any 
> explicit specification of type `Shape`, so that the returning value will have 
> a dynamic type, which is just what I want. Here, the type of `copied` is 
> `Self`
> 
> However, if I try to make a subclass of Shape, I can't find a elegant way to 
> implement this `copy` method in that subclass, the following code will not 
> compile.
> 
> class Circle: Shape {
>     var radius: Float = 5
> 
>     func copy() -> Self {
>         let copied = super.copy() 
>         copied.radius = radius     // compilation error
>         return copied
>     }
> }
> 
> The compiler will complain that `copied` has no property `radius`. It turns 
> out that calling copy() on super will yield a value of type Shape, rather 
> than Self. 
> 
> Swift now forbids explicit conversion to `Self` (I totally agree with this 
> rule), and will automatically allow `Self` to be treated as a specific type 
> in some circumstances. But for this case, I wonder whether this is the 
> correct behavior or a bug? Why calling `super.copy()` not be able to get a 
> `Self`?
> 
> I did find a work-around for this problem afterwards, but this question 
> really haunts me...
> 
> Cheers,
> Lincoln.
> _______________________________________________
> 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