[swift-evolution] [Pitch] Rename `x.dynamicType` to `x.Self`

Howard Lovatt howard.lovatt at gmail.com
Thu Apr 14 19:47:05 CDT 2016


+1 nice addition

  -- Howard.

On 14 April 2016 at 11:41, Joe Groff via swift-evolution <
swift-evolution at swift.org> wrote:

> It's been pitched before, but I don't think we've had a dedicated thread
> to this idea. Erica has proposed making `Self` generally available within
> methods in types to refer to the dynamic type of the current receiver. One
> could think of `Self` as a special associated type member that exists in
> every type for this purpose. This also happens to be what you get when ask
> for the `dynamicType` member of a value. We could unify these concepts and
> get rid of the clunky `dynamicType` keyword, replacing it with `x.Self`.
>
> There's another benefit to this syntax change. Looking to the future, one
> of the many features Doug pitched in his generics manifesto was to
> generalize protocol existentials, lifting our current restrictions on
> protocols "with Self or associated types" and allowing them to be used as
> dynamic types in addition to static generic constraints. Once you do this,
> you often want to "open" the type of the existential, so that you can refer
> to its Self and associated types in the types of other values. I think a
> natural way would be to let you directly use Self and associated type
> members of existentials as types themselves, for example:
>
>         let a: Equatable = /*...*/
>         let b: Equatable = /*...*/
>
>         // This is not allowed, since Equatable requires two values with
> the same static type, but
>         // a and b may have different dynamic types.
>         a == b
>
>         // However, we can dynamically cast one to the other's dynamic
> type:
>         if let bAsA = b as? a.Self {
>                 return a == bAsA
>         }
>
>         let x: RangeReplaceableCollection = /*...*/
>         let y: Collection = /*...*/
>
>         // If y has the same dynamic Element type as x, append it to x
>         var z: x.Self = x
>         if let yAsX = y as? Any<Collection where Element == x.Element> {
>                 z.append(yAsX)
>         }
>
> `x.Self` then becomes just the first step in this direction.
>
> -Joe
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160415/2f32ad4b/attachment.html>


More information about the swift-evolution mailing list