[swift-evolution] Default implementation of protocols

Karl Wagner razielim at gmail.com
Mon Jan 23 19:57:01 CST 2017

> On 24 Jan 2017, at 01:13, Jonathan Hull via swift-evolution <swift-evolution at swift.org> wrote:
> Have we considered allowing a struct/class/enum to have the same name as a protocol as long as it conforms to the protocol?  Type declarations would have to always mean the protocol (which includes the concrete type as well).  Static functions would always apply to the concrete type.
> Seems like a good way to support having a default implementation of a protocol.  I am always running into the awkward naming issues around this...
> 	protocol X {
> 		//yada yada
> 	}
> 	struct X { //Implicitly adheres to protocol X (because it must)
> 		init(){…}
> 	}
> 	let myVar:X //This refers to the protocol
> 	let otherVar = X() //This makes the struct
> If we do need to be able to spell the concrete type for other uses, we could probably do something like: ‘concrete(X)’ which isn’t pretty, but is there for the rare times it is needed for utility.  I can’t think of any reason except making an array of the concrete type.
> I am guessing there is a subtle technical reason this won’t work, but I wanted to mention it now just in case it is possible.  Seems like it could have a large (simplifying) effect on the namespace of the standard library.
> Thanks,
> Jon
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

IMO, the way to do this is by nesting the struct inside the protocol (not possible yet). For example, the standard library contains EmptyCollection and CollectionOfOne. I think the way to express such things would be as: Collection.Empty<T> and Collection.One<T>.

Not promising anything about the stdlib interface itself, but in general I think these kind of canned conformances are ideal candidates for nesting. So in your case you might have X.Default (or something more meaningful).

- Karl

More information about the swift-evolution mailing list