I’m not sure about a general rule, but I think that labels should be required 
for associated types and type aliases. I can’t check right now if this changed 
in Swift 3, but in earlier version Dictionary for example has the associated 
type Element which is a tuple of (Key, Value). While using this via .0 and .1 
is fine generally, I’d much rather the parameters were named key and value for 
absolute clarity, and think that this the way to go with these. For ad-hoc 
tuples it doesn’t matter so much, but yeah, the rest of the time I’d prefer to 
be clear.

While it may be annoying in cases where names don’t match, I think that’s fine 
too, as it forces us to be explicit about what’s happening, as it may not 
always be clear to someone new to maintaining the code. There could perhaps be 
a simpler syntax for mapping tuples, or an attribute/compiler directive to 
ignore the mismatch anywhere it occurs?

> On 20 Apr 2016, at 14:23, Adrian Zubarev via swift-evolution 
> <[email protected]> wrote:
> 
> I would like to discuss about the following topic.
> 
> Wouldn't it be better to enforce argument labels on tuples types, if the 
> tuple type defines them?
> 
> ```swift
> 
> func foo(tuple: (a: Int, b: Int)) { /* do something */ }
> 
> let test1 = (10, 100)
> let test2: (a: Int, c: Int) = test
> let test3: (Int, Int) = test2
> 
> foo(test1)
> foo(test3)
> 
> /*
> cannot convert value of type '(a: Int, c: Int)' 
> to expected argument type '(a: Int, b: Int)'
> */
> foo(test2) 
> 
> ```
> 
> Function `foo` awaits a tuple of type `(a: Int, b: Int)` but `test1` and 
> `test3` are both just of type `(Int, Int)`.
> As expected `test2` will raise an error because it has indeed a wrong type 
> `(a: Int, c: Int)`.
> 
> I'd suggest to enforce argument labeling on tuple types for better 
> readability, because wasn't it the idea behind labels inside tuples?
> 
> `foo(test1)` should raise an error `cannot convert value of type '(Int, Int)' 
> to expected argument type '(a: Int, b: Int)'` as long as `test1` is not 
> written like `let test1 = (a: 10, b: 100)` or `let test1: (a: Int, b: Int) = 
> (a: 10, b: 100)`
> 
> This will impact current codebase if you used labels but provided tuples 
> without labels like the example above. The migrator could solve this by 
> providing labels automatically to tuples where this error occurs.
> 
> I'm not good at writing proposals for the GitHub repository at all, so if the 
> community likes this idea, I'd be glad to see some help for this little 
> proposal.
> 
> -- 
> Adrian Zubarev
> Sent with Airmail
> _______________________________________________
> swift-evolution mailing list
> [email protected] <mailto:[email protected]>
> https://lists.swift.org/mailman/listinfo/swift-evolution 
> <https://lists.swift.org/mailman/listinfo/swift-evolution>
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to