SE-0269 - Multi-Pattern Catch Clauses
Swift は開始以来、末尾のクロージャのラベルを省略できる Trailing closure という構文をサポートしてきました。
// Without trailing closure: UIView.animate(withDuration: 0.3, animations: { self.view.alpha = 0 }) // With trailing closure: UIView.animate(withDuration: 0.3) { self.view.alpha = 0 }
これにより、Swift では簡潔でネストの少ない読みやすいコードを書くことができていましたが、その一方でクロージャが連続した(複数ある)場合などに Trailing closure を使用すると、末尾のクロージャが何を表しているのかが分かりづらいという問題がありました。
// Without trailing closure: UIView.animate(withDuration: 0.3, animations: { self.view.alpha = 0 }, completion: { _ in self.view.removeFromSuperview() }) // With trailing closure UIView.animate(withDuration: 0.3, animations: { self.view.alpha = 0 }) { _ in self.view.removeFromSuperview() }
また、これらの問題は初期の頃から認識されていて、複数のクロージャがある場合は、Trailing closure の使用は禁止とされていたそうです。(僕は普通に使ってしまうことが多かった🤧 )
Swift5.3 ではこれが改善され、複数のTrailing closure を使った場合でも末尾のクロージャにラベルを含めることができるようになったそうです。
// Single trailing closure argument UIView.animate(withDuration: 0.3) { self.view.alpha = 0 } // Multiple trailing closure arguments UIView.animate(withDuration: 0.3) { self.view.alpha = 0 } completion: { _ in self.view.removeFromSuperview() }