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