Thank you, Slava. I will use the trick you provided. And knowing that this bug has already been under tracking is a great comfort to me, really :)
Lincoln > 在 2017年8月11日,上午11:29,Slava Pestov <spes...@apple.com> 写道: > > >> On Aug 10, 2017, at 8:23 PM, Slava Pestov via swift-users >> <swift-users@swift.org <mailto: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 >>> <https://lists.swift.org/mailman/listinfo/swift-users> >> >> _______________________________________________ >> 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