Protocol methods should accept default arguments

Default parameters are in my opinion an implementation detail and should be always handled by the conforming type. What can be done here is only declare the 4th method in the protocol and create a protocol extension with default forwarding.

···

On 04 Dec 2015, at 17:31, Ben <ben_cocoa_dev_list@yahoo.co.uk> wrote:

Hi list,

I propose that methods defined in protocols should accept default arguments. This could help remove the need for method families where only one parameter is essential, but others are often used.

For example:

protocol Datastore {
  func executeQuery(query: String)
  func executeQuery(query: String, usingParameters: [Any])
  func executeQuery(query: String, usingParameters: [Any], logType: LogType)
  func executeQuery(query: String, usingParameters: [Any], logType: LogType, completionHandler:ClosureOfSomeSort)
}

Where typically the implementing object funnels the first three methods through to the final, more verbose method.

This could be shortened to:

protocol Database {
  func executeQuery(query: String, usingParameters: [Any] = , logType: LogType = .NotLogged completionHandler:ClosureOfSomeSort? = nil)
}

Advantages:
- Only one method to implement
- Less to document, less cluttered interface
- Prevent objects adopting the protocol from using different default values
- Prevent objects from implementing similar methods in the family differently - fewer code paths to inspect, less confusion over behaviour since no argument values are hidden

This fits in well with the parameters section of the Swift API design page: https://swift.org/documentation/api-design-guidelines.html#parameters

What do you think?

Regards,

Ben Barnett

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution