I like this idea. I think, if we could use `self` to access instance of self, we should be allowed to use `Self` to access type of self.
2016-04-14 8:46 GMT+04:00 William Dillon via swift-evolution < [email protected]>: > This would be great! > > I use a nearly identical pattern in my networking framework that would be > nice to streamline: > > public func ==(lhs: NetworkAddress, rhs: NetworkAddress) -> Bool { > // Only addresses of the same protocol are considered equal. > guard lhs.dynamicType == rhs.dynamicType else { > return false > } > > > if lhs.dynamicType == IPv4NetworkAddress.self { > return (lhs as! IPv4NetworkAddress) == (rhs as! IPv4NetworkAddress > ) > } > > if lhs.dynamicType == IPv6NetworkAddress.self { > return (lhs as! IPv6NetworkAddress) == (rhs as! IPv6NetworkAddress > ) > } > > > return false > } > > - Will > > On Apr 13, 2016, at 6:41 PM, Joe Groff via swift-evolution < > [email protected]> 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 > [email protected] > https://lists.swift.org/mailman/listinfo/swift-evolution > > > > _______________________________________________ > swift-evolution mailing list > [email protected] > https://lists.swift.org/mailman/listinfo/swift-evolution > >
_______________________________________________ swift-evolution mailing list [email protected] https://lists.swift.org/mailman/listinfo/swift-evolution
