+1, I also support. We already have Self in meaning of dynamicType as result of method, for example:

class A {
    func some()->Self {
//print(self.dynamicType) // btw: if we uncomment this - will get run-time error wtf??
        return self
    }
}

class B:A {
}

var aa = B()

print(aa.some().dynamicType)

so why do we need to have this "dynamicType" instead of "Self".
It seems to be natural to have

print(aa.some().Self)


On 14.04.2016 4:41, Joe Groff via swift-evolution 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

Reply via email to