Generic typealias in Swift

Generic Type Aliases - SE-0048

Status: Implemented (Swift 3)

The solution is straight-forward: allow type aliases to introduce type parameters, which are in scope for their definition. This allows one to express things like:

typealias StringDictionary<T> = Dictionary<String, T>
typealias IntFunction<T> = (T) -> Int
typealias MatchingTriple<T> = (T, T, T)
alias BackwardTriple<T1, T2, T3> = (T3, T2, T1)

Generic typealias can be used since Swift 3.0. This should work for you:

typealias Parser<A> = (String) -> [(A, String)]

Here is the full documentation: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Declarations.html#//apple_ref/swift/grammar/typealias-declaration

Usage (from @Calin Drule comment):

func parse<A>(stringToParse: String, parser: Parser) 

typealias cannot currently be used with generics. Your best option might be to wrap the parser function inside a struct.

struct Parser<A> {
    let f: String -> [(A, String)]
}

You can then use the trailing closure syntax when creating a parser, e.g.

let parser = Parser<Character> { string in return [head(string), tail(string)] }

Tags:

Generics

Swift