Posted at

Swiftのメソッドで引数の型指定を間違っていてもコンパイルエラーにならないパターンがあった


はじめに

Selectorのお話。

Swiftでもメソッドで定義している型とはまったく異なるオブジェクトを渡してもクラッシュせずに動いてしまうパターンがあったことに驚いたのでメモ。


実装


呼び出し元


let gesture = UITapGestureRecognizer(target: self, action: #selector(tapped(_:)))
tapView.addGestureRecognizer(gesture)


メソッドの定義


@objc private func tapped(_ sender: UIView) {
self.delegate?.tapped(tapped: sender)
}

senderにUIViewなんか渡ってこないけどこんな定義をしていて、基本的に動いていた・・・

delegateに渡したUIViewを取り扱う必要がある一部のケースでクラッシュして判明。

Selectorの引数定義は十分に気をつける。