I do not understand why we can’t do type(self)
or even #type(self) Personally, I find .Self business to be quite confusing and idiosyncratic. Having a generic #type() directive would be a general improvement for the language design and it would also open up future possibilities such as extension A where A.B == #type(A.C.property1) { } and other potentially useful things. > On 14 Apr 2016, at 03:41, Joe Groff via swift-evolution > <swift-evolution@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@swift.org > https://lists.swift.org/mailman/listinfo/swift-evolution _______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution