[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


*Problem:*

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




*Motivation:*

Consider the following contrived example:

class Vehicle {

    var currentSpeed = 0

    //..

}


class Bicycle: Vehicle {

    //..

}


class Car: Vehicle {

    //..

}


@discardableResult

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 }

        //..

        processed.append(t)

    }



    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



*Notes:*

If necessary, the (real life) Swift code that lead to the proposal could be
shared.
-------------- 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