> On Aug 10, 2017, at 8:23 PM, Slava Pestov via swift-users > <swift-users@swift.org> wrote: > > 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
I’m sorry, but this is nonsense. We don’t allow ‘Self’ to refer to the dynamic Self type yet. You could do something like this I guess, func cast<T, U>(from: T, to: U.Type) -> U { return from as! U } let copied = cast(from: super.copy(), to: type(of: self)) Slava > > Slava > >> On Aug 10, 2017, at 8:16 PM, 吴君恺 via swift-users <swift-users@swift.org >> <mailto: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 <mailto: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
_______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users