[swift-evolution] [proposal] Allow function argument type to be omitted when passing a default value from which it can be inferred

Dominik Pich dominik at pich.info
Tue May 10 12:12:20 CDT 2016


I think it would add consistenceā€¦ everywhere else types can be inferredā€¦ why not here

> On May 10, 2016, at 12:02 PM, Sam Dods via swift-evolution <swift-evolution at swift.org> wrote:
> 
> I propose that function argument types could be omitted in the same way as variable and property argument types are omitted when they are set at point of definition.
> 
> At present the type of properties and variables can be inferred as below:
> 
> class EvolutionManager {
>  let proposalManager = ProposalManager()           // type is inferred
> 
>  func proposeTopic(topic: String) {
>    let evolution = Evolution(topic: topic)         // type is inferred
>    proposalManager.proposeEvolution(evolution)
>  }
> }
> 
> However, function arguments cannot be inferred, as below:
> 
> class EvolutionManager {
>  func proposeEvolution(evolution: Evolution, proposalManager = ProposalManager()) {       // compiler error, cannot infer type
>    proposalManager.proposeEvolution(evolution)
>  }
> }
> 
> It's a nice feature of the language that the type can be inferred for properties and variables, so I don't see any reason not to allow the same for function arguments. It allows for more concise code, and adds consistency with other language features. And I don't personally think it would make our code any harder to read.
> 
> There are of course some cases where the type cannot be inferred, i.e. when the type should actually be a protocol type and the default value is a concrete type. Consider the following:
> 
> protocol ProposalHandler {
>  associatedType P : Proposable
>  propose(p: P)
> }
> 
> class EvolutionManager {
>  // the type would be inferred as the concrete type `ProposalManager` and could not be
>  // called with any other argument type that conforms to the `ProposalHandler` protocol,
>  // as may have been the intention
>  func proposeEvolution(evolution: Evolution, proposalHandler = ProposalManager())
> 
>  // instead it should be written as follows:
>  func proposeEvolution(evolution: Evolution, proposalHandler: ProposalHandler = ProposalManager())
> }
> 
> But this is the same for properties and variables, so it should not be a reason to not allow inferring of function arguments. For example:
> 
> class EvolutionManager {
>  // the property is inferred as the concrete type `ProposalManager` and may not
>  // be set to any other value of type that conforms to the `ProposalHandler` protocol,
>  // as may have been the intention.
>  var proposalHandler = ProposalManager()
> 
>  // instead it should be written as follows:
>  var proposalHandler: ProposalHandler = ProposalManager()
> }
> 
> What do people think of this?
> 
> It would have no impact on existing code, and it's not the kind of thing that needs an alternative solution.
> 
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution



More information about the swift-evolution mailing list