[swift-evolution] [Pre-pitch] Conditional default arguments

Slava Pestov spestov at apple.com
Tue Nov 28 15:28:22 CST 2017



> On Nov 28, 2017, at 1:25 PM, Matthew Johnson <matthew at anandabits.com> wrote:
> 
> 
>> On Nov 28, 2017, at 3:18 PM, Slava Pestov <spestov at apple.com <mailto:spestov at apple.com>> wrote:
>> 
>> 
>> 
>>> On Nov 28, 2017, at 8:44 AM, Matthew Johnson <matthew at anandabits.com <mailto:matthew at anandabits.com>> wrote:
>>> 
>>> func makeResource(
>>>     with configuration: Configuration = () where Configuration == Void, 
>>>     actionHandler: @escaping (Action) -> Void = { _ in } where Action == Never
>>> )
>> 
>> Similar question to the one I posed earlier — what happens if I’m using makeResource() from a generic context? Is the conditional default argument simply not available?
> 
> Right.  If the constraints are not met at the call site the default is not available.  I think you understood, but looking at the example above I omitted the resource type parameter.  It should read:
> 
> func makeResource<R: Resource>(
>     with configuration: R.Configuration = () where R.Configuration == Void, 
>     actionHandler: @escaping (R.Action) -> Void = { _ in } where R.Action == Never
> )
> 
>> 
>> In this case, how is it different from defining some static overloads of makeResource(), some of which have default arguments and some of which are generic?
> 
> From the point of view of the call site it is not different.  The differences are that:
> 
> * the user is presented with a single API rather than several overloads

Is this less confusing than encountering a new ‘where’ clause on default arguments, which is probably rare enough that many users will spend months/years using Swift without seeing it?

> * the compiler doesn’t have to reason about an overload set which might improve build times, etc

They’re effectively equivalent, because we still have to decide which subset of the default arguments apply at a given call site by checking all combinations of constraints.

Slava

> 
>> 
>> Slava
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20171128/9ca55d75/attachment.html>


More information about the swift-evolution mailing list