> On Dec 21, 2015, at 11:07 AM, Matthew Johnson <matt...@anandabits.com> wrote:
> 
> 
>> On Dec 21, 2015, at 12:43 PM, Dmitri Gribenko <griboz...@gmail.com> wrote:
>> 
>> On Mon, Dec 21, 2015 at 10:40 AM, Matthew Johnson
>> <matt...@anandabits.com> wrote:
>>> 
>>>> On Dec 21, 2015, at 12:36 PM, Dmitri Gribenko via swift-evolution 
>>>> <swift-evolution@swift.org> wrote:
>>>> 
>>>> On Mon, Dec 21, 2015 at 10:34 AM, Joe Groff <jgr...@apple.com> wrote:
>>>>> 
>>>>>> On Dec 18, 2015, at 6:52 PM, Dmitri Gribenko <griboz...@gmail.com> wrote:
>>>>>> 
>>>>>> On Fri, Dec 18, 2015 at 6:21 PM, Joe Groff <jgr...@apple.com> wrote:
>>>>>>> 
>>>>>>> On Dec 18, 2015, at 6:08 PM, Dmitri Gribenko <griboz...@gmail.com> 
>>>>>>> wrote:
>>>>>>> There's also a possibility that we add 'out' parameters in the future, 
>>>>>>> and
>>>>>>> if 'inout' would be spelled '&', then we would need to find another 
>>>>>>> sigil
>>>>>>> for 'out'.
>>>>>>> 
>>>>>>> We have multiple returns. Why would we ever add out parameters?
>>>>>> 
>>>>>> I don't want to turn this thread into a discussion about out
>>>>>> parameters, but one reason would be to replace
>>>>>> AutoreleasingUnsafeMutablePointer.
>>>>> 
>>>>> IMO we should eventually import out params from C as multiple returns.
>>>>> 
>>>>>> Another one is to add labels to
>>>>>> the output parameters:
>>>>>> 
>>>>>> let (day, month, year) = parseDate()
>>>>>> let (year, day, month) = parseDate() // bug?
>>>>> 
>>>>> Labeled tuples seem like they could help with that, with compiler QoI to 
>>>>> catch cases like this where you obviously permuted the return names.
>>>> 
>>>> Currently they don't help:
>>>> 
>>>> (swift) func parseDate() -> (day: Int, month: Int, year: Int) { return 
>>>> (0,0,0) }
>>>> (swift) let (year, month, day) = parseDate()
>>>> // (year, month, day) : (Int, Int, Int) = (0, 0, 0)
>>> 
>>> 
>>> Looks like they help to me:
>>> 
>>> func labeledMultiReturn() -> (string: String, int: Int) {
>>>   return (string: "hello", int: 42)
>>> }
>>> 
>>> let (string: boundString, int: boundInt) = labeledMultiReturn()
>>> 
>>> print(boundString)
>>> print(boundInt)
>> 
>> Well, they don't *force* you to use labels at the use site,
>> allowing bugs to happen even if the API author went out of their way
>> and used labels.
> 
> Got it.  Objection understood.  That said, wouldn’t it be a relatively small 
> change to require their use at the call site when the API author includes 
> them in the return type, at least when the result is directly bound to 
> variables?

That, or require either the label be explicit or that the binding name match 
the label. 'let (foo: foo, bar: bar)' would be a bit unfortunate.

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

Reply via email to