[swift-evolution] [Draft] Introducing StaticSelf, an Invariant Self

Nicola Salmoria nicola.salmoria at gmail.com
Sat May 14 00:55:32 CDT 2016

Matthew Johnson via swift-evolution <swift-evolution at ...> writes:

> I agree it’s a bit tricky.  But that’s better than not possible at all.
 You just need a typealias and a same type constraint to make this work as
expected / desired:
> protocol Makable {
> 	typealias RootMakable = StaticSelf
> 	static func make(value: Int) -> StaticSelf
> }
> func makeWithZero<T: Makable where T == T.RootMakable>(x: Int) -> T {
> 	return T.make(value: 0) // works now
> }
> Now that we have a typealias we can refer to the binding of StaticSelf and
constrain it as necessary for whatever purpose we have in mind.  In some
cases that will be a same type constraint so that our code works properly
with class clusters.  I don’t have concrete examples of other use cases but
can imagine use cases constraining the typealias to a protocol, for example.

You can do that today:

protocol Makable {
    associatedtype MadeType
    static func make(value: Int) -> MadeType

func makeWithZero<T: Makable where T == T.MadeType>(x: Int) -> T {
    return T.make(value: 0)

You can't currently constrain MadeType to be the same as the conforming
type, but, does it matter? What kind of extra guarantees would that give,
since you need to add the extra constraint anyway in generic code?


More information about the swift-evolution mailing list