
Breaking changes
If we would summarise all implemented Swift 4 proposals, we would (as of 31–5–17,) come up with the following list.

Distinguish between single-tuple and multiple-argument function types”Š—”Š(SE-0110)
With this proposal, you now have to manually expand tuples from the now-single parameter. Let’s explain using a example.
typealias Name = (firstName: String, lastName: String) let names: [Name] = [("Bart", "den Hollander")]
// Swift 3 names.forEach({ first, last in print(last) // "den Hollander" })
The ‘first’ and ‘last’ variables are expanded from the tuple by the Swift 3 compiler. This is very helpful and readable. Now let’s do the same within Swift 4.
// Swift 4 names.forEach({ first, last in print(last) }) // error: closure tuple parameter '(firstName: String, lastName: String)' does not support destructuring
The reason this doesn’t work anymore is because in Swift 4 you have to manually expand tuples from a single parameter. You can do the following to fix this.
// Swift 4 A: Expand by providing the tuple key names.forEach({ name in print(name.lastName) // "den Hollander" }) B: Expand by providing the amount of tuple elements in a variable names.forEach({ name in let (first, last) = name print(last) // "den Hollander" }) C: Change to a for loop for (first, last) in names { print(last) // "den Hollander" }
Still the question is raised as to why this change was introduced. This question is answered by Joe Groff, Swift Compiler Engineer at Apple.
https://twitter.com/jckarter/status/867750246935216128
I think that although this change may result in better type checker performance, this will lead to worse readability of the syntax.