[swift-evolution] [Pitch] Adding a Self type name shortcut for static member access
Jeremy Pereira
jeremy.j.pereira at googlemail.com
Thu Apr 7 10:02:11 CDT 2016
> On 7 Apr 2016, at 14:17, Brent Royal-Gordon <brent at architechies.com> wrote:
>
>> As I understand it, the proposal is that `Self` can be used as an alias to `self.dynamicType`, which is an object in the sense of entity in Swift but not an instance of a class or struct.
>
> You don't understand it correctly.
Having read your email, I’m pretty sure I do, and my problem with it remains.
>
>
> `Self` isn't supported in value types because, since you can't subclass value types, it always means exactly the same thing as writing the type's name. `Self` also isn't supported in the bodies of class members because, when you call members on it, it's equivalent to `self.dynamicType`. This is actually really strange, though, because it means that you can't actually write certain types explicitly. For instance:
>
> class Foo {
> func foo() -> Self {
> let new = self.dynamicType.init()
> // `new` is of type Self, but you can't actually write `let new: Self`
> return new
> }
> required init() {}
> }
It’s not _really_ strange. The type of new cannot be known at compile time, only that it is some subclass of Foo (or Foo itself of course).
>
> What this proposal is saying is:
>
> * `Self` will be allowed in value types. It will always mean the same thing as writing the type's name explicitly, but that's okay; it's more readable.
Is it more readable? Has anybody done any objective testing?
> * `Self` will be allowed in member bodies. This will allow you to write that `new` line as:
>
> let new: Self = Self()
And that is certainly not more readable than the line it replaces. The line it replaces tells me explicitly that I am creating a new object of the same type as self. This does not. The casual reader might easily assume that you will get an object of type Foo.
>
> People seem to be okay with things like `var string: String`; having `self` be of type `Self` is no different.
I’m not wild about that either (especially as my autocomplete seems to go for the type before the variable every time) and if you used a variable called `string` in the same context as a lot of static methods on `String` it would suffer from the same problem that I am concerned about wrt readability.
>
More information about the swift-evolution
mailing list