[swift-users] Extending a generic type where T == Void

Benedict Cohen ben at benedictcohen.co.uk
Tue Aug 9 13:10:19 CDT 2016

I have an enum that represents the states of a task:

enum TaskState<InType, OutType>{
case preparing
case ready(InType)
case executing(InType, TaskIdentifier)
case success(InType, OutType)
case failure(InType, Error)

mutating func transition(toReady: InType) {...}


var locationSearchTaskState: TaskState<String, [Location]> = .preparing
locationSearchTaskState.transition(toReady: text)

This works as desired for most cases. Not all tasks, however, have an input:

var topLocationsTaskState<Void, [Location]> = .ready( () )

In this case we have to pass the empty tuple as the value which is ugly. I'd like to add some sugar to make this nicer. Something along the lines of:

extension TaskState where InType: Void {...}

Of course this doesn't work because Void is not a protocol (nor can it conform to a protocol because it's just a tuple). So my question: How can I extend a generic type when the generic parameter is Void? Are there alternative ways to model this problem?


More information about the swift-users mailing list