[swift-evolution] Notes from Swift core team 2016-04-20 design discussion

Vladimir.S svabox at gmail.com
Thu Apr 21 12:09:49 CDT 2016

"Another approach would be to introduce a new dynamictype keyword that 
doesn’t need to be accessed as a member of self, and keep Self the way it 
is.  Self should work in structs as a type alias."

So, could you clarify, do you suggest to introduce dynamictype keyword 
instead of "self.dynamicType" ? (In addition to remove .self on type and 
.Self for instance)

And to leave Self just as placeholder for current type i.e. "the class 
there this is declared"  ?

Just want to clarify. Let's review this code:

protocol Proto {
     func z() -> Self
     func z(s: Self)

class X: Proto {
     required init () {}
     func x() -> Self { return self.dynamicType.init() }
     func z() -> Self { return self }
     func z(s: X) {}

How should it looks like in Swift 3.0 ? :

protocol AP {
     func z() -> dynamictype
     func z(s: Self)

class X: AP {
     required init () {}
     func x() -> dynamictype { return dynamicType.init() }
     func z() -> dynamictype { return self }
     func z(s: X) {} // ? Don't we want to have Self here ?

Do you support to extend Self to be used in class methods declarations to 
behave just like in protocol i.e. as "placeholder for defined class" ?

So we can have in class:
     func z(s: Self) {}

Do you support to rename Self -> #Self ?

Thank you for answers.

On 21.04.2016 18:58, Alex Martini via swift-evolution wrote:
> To help keep proposals moving forward, the Swift core team has set aside
> some time specifically for design discussions of upcoming proposals.  Below
> are some rough notes from the yesterday's discussion.
> These are informal comments, intended to guide the proposals in directions
> that draw constructive feedback. You are welcome to ignore the
> feedback, agree with it, or disagree with it.  As always, the formal
> decision doesn't happen until after the review period ends.
>       SE-0068: Expanding Swift Self to class members and value types
> https://github.com/apple/swift-evolution/blob/master/proposals/0068-universal-self.md
> We have one keyword left in the language, dynamicType, which is camel
> cased. This proposal renames it to Self instead.
> In a static function today, self.dynamicType will give you a metatype but
> the non-member Self will not. The most useful reason to reference it is to
> call an initializer. It makes accessing the metatype weirder. It’s
> not Self.Type; that’s a type — you have to spell it Self.type.
> Quiz time! What do each of the permutations mean?
> Self.self
> self.Self
> Self.Self
> self.self
> The number of capital letters gives you the level of meta-ness. This is
> very subtle, which is probably not a good thing.
> Another approach would be to introduce a new dynamictype keyword that
> doesn’t need to be accessed as a member of self, and keep Self the way it
> is.  Self should work in structs as a type alias.
> Why don’t we turn this into a standard library function? It’s not something
> you need so often that the member access is very valuable. Putting it in
> the standard library as dynamicType(_:) does still allow for that function
> to be implemented using compiler magic.
> func dynamicType<T>(_: T) -> T.Type { }
> We have a proposal to remove .self on types. One reason .self exists is to
> avoid the mistake of writing let x = Int — the compiler will give you a
> weird type error later on in code if the value of x is what we today
> call Int.self but you meant to call the Int() initializer. Creating a
> metatype is not a common operation, so doing it explicitly is a good thing.
> It’s weird that you can use the metatype directly to construct something or
> to do member access, but you can’t access it as a bare value.
> Coming back to this proposal, if we removed .self why would we want to
> add .Self?
> If you have a variable whose value is a metatype, you also keep its name in
> lower case. So Self makes a little less sense from that aspect too.
> Another perspective is that .dynamicType is just an implicitly synthesized
> property on all type.
> We do have other keywords that follow the dot on
> types, Int.Type and Fooable.Protocol, so this isn’t the only thing. Those
> things are magic nested types.
> Subjectively, having dynamicType as a member feels weird.
> If .self goes away, the four-self example above is simplified,
> and .Self doesn’t make sense anymore. There’s also the difference
> that .Self would be a runtime thing.
>       What to do about optional requirements
> http://thread.gmane.org/gmane.comp.lang.swift.evolution/14046
> People commonly ask why optional only works on Objective-C protocols, and
> the responses they get are usually that in Swift code you should reshape
> your protocols. As a starting assumption, we’re not making optionl work in
> Swift. So what do we do about this as part of the interoperability code?
> People do write these, but it’s often because they’re writing a delegate
> protocol and they’re following the example of Cocoa frameworks.
> Roughly three things we can do:
>  1. Rename it to make it clearly an Objective-C interop feature. We could
>     also forbid you actually spelling it in Swift code. That doesn’t work
>     well because it breaks your ability to write code in Swift that has
>     Objective-C clients — those clients won’t get the default
>     implementation from the extensions like you would use with Swift
>     clients instead of creating optional requirements.
>  2. Modeling optional requirements as a function of optional type such
>     as ((A, B) -> C)? doesn’t work well. For example, properties can have
>     optional type and they can be optional requirements, so you would end
>     up having to deal with a lot of extra complexity due to
>     double-optionals and likely want better code completion so you could
>     type it all out.
>  3. You force the default implementation to be visible from all callers,
>     and you do the dispatch at the call site. The only advantage of this is
>     that it takes optional requirements out of the language entirely. If
>     you wanted to implement the (somewhat common) pattern of checking
>     whether a type implements an optional requirement, you would have to
>     use a respondsToSelector check.
> The best pattern we’ve seen for checking conformance and using different
> code paths based on that is to use finer-grained protocols. (But there are
> still issues with organizing your code that way.)
> The caller default (#3) is really the only way to get optional requirements
> out of the type system. The weird code path in the compiler here is the
> same as the weird code path as we have in AnyObject. But it doesn’t look
> like we’re going to be able to do that.
> We can rename this as objcoptional or possibly demote it to an attribute.
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

More information about the swift-evolution mailing list