[1, 2, 3].forEach(test)
This should be an error, because it's ambigious whether test(first:) or test(second:) is implied (test(first:second:) is also an option, but is disqualified for its incompatible type). You see this often with map(SomeType.init), where different initializers my be applicable, so it must be disambiguated (for example) with map(SomeType.init(something:).
[1, 2, 3].forEach(anotherTest)
This is unambiguous, the first must be defaulted, second must be the closure parameter
[(1, 2), (3, 3)].map(multiApply)
This is also unambiguous, first and second are required, and third must be defaulted, or the type will be wrong.
Yes, and { print($0) } already does this (notice, we don't contruct the array ourselves with { print([$0]) }, which is illegal ([T] can't be argument to a T...)
Populate them, the same way { print($0) } does.
Only if that leads to an unambiguous solution
Could you elaborate on this?
This restriction is only necessary if the varargs aren't followed by keyworded parameters. E.g. if I wanted to have the last closure arg to be applied to the seperator, rather than as part of the vararg, I could convey that with print(separator:), whereas print should be taken to mean "I omitted separator and terminator, so default them, and pack all args into the varargs