iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

Swift5.3 つまみ食い【SE-0279編】

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 の使用は禁止とされていたそうです。(僕は普通に使ってしまうことが多かった🤧 )

google.github.io

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()
}

参考

github.com

swift.org

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com