[swift-evolution] Proposal: Allow explicit type parameter specification in generic function call

Ramiro Feria Purón ramiro.feria.puron at gmail.com
Mon Nov 21 17:05:48 CST 2016


Currently, it is not possible to be explicit about the generic parameters
(type parameters) in a generic function call. Type parameters are inferred
from actual parameters:

func f<T>(_ t: T) {



f(5)            // T inferred to be Int
f("xzcvzxcvx")  // T inferred to be string

If no type parameter is involved in the formal parameters, the type
parameter needs to be used somehow as part of the return type. For example:

func g<T>(_ x: Int) -> [T] {

    var result: [T] = []


    return result


In such cases, the type parameters must be inferrable from the context:

g(7)                            // Error: T cannot be inferred

let array = g(7)                // Error: T cannot be inferred

let array: [String] = g(7)      // Ok: T inferred to be String

let array = g<String>(7)        // Error: Cannot explicitly specialise
generic function

*Proposed Solution:*

Allow explicit type parameters in generic function call:

let _ = g<String>(7)            // Ok


Consider the following contrived example:

class Vehicle {

    var currentSpeed = 0



class Bicycle: Vehicle {



class Car: Vehicle {




func processAll<T: Vehicle>(in vehicles: [Vehicle], condition: (Vehicle) ->
Bool) -> [T] {

    var processed: [T] = []

    for vehicle in vehicles {

        guard let t = vehicle as? T, condition(vehicle) else { continue }




    return processed


func aboveSpeedLimit(vehicle: Vehicle) -> Bool {

    return vehicle.currentSpeed >= 100


let processedVehicles = processAll(in: vehicles, condition: aboveSpeedLimit)
      // Uh, T inferred to be Vehicle!

let processedCars: [Car] = processAll(in: vehicles, condition:
aboveSpeedLimit)     // T inferred to be Car

processAll<Bicycle>(in: vehicles, condition: aboveSpeedLimit)
        // This should be allowed under this proposal


If necessary, the (real life) Swift code that lead to the proposal could be
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20161122/1f28136a/attachment.html>

More information about the swift-evolution mailing list