[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