27
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

IBActionのsenderはAnyでなく具体的な型を指定しよう(Swift)

Last updated at Posted at 2020-06-16

UIButton タップ時の処理などを IBAction で紐付けるとき、 型は Any がデフォルトなので、そのままにする人も多いのではないでしょうか。
スクリーンショット_2020-06-16_11_39_03.jpg

×
final class FooViewController: UIViewController {
    @IBAction private func didTapCloseButton(_ sender: Any) {
    }
}

それだとキャストしないと型に応じた処理を実行できないので、具体的な型を選択して紐付けるのが望ましいです。
スクリーンショット_2020-06-16_11_43_16.jpg

○senderを具体的な型にすると、キャストせずに型に応じた処理を実行できる
final class FooViewController: UIViewController {
-     @IBAction private func didTapCloseButton(_ sender: Any) {
+     @IBAction private func didTapCloseButton(_ sender: UIButton) {
    }
}

デフォルトが Any なので、それを選択したほうがいい理由もあるのかと思っていたのですが、どうやらObjective-Cの仕様なだけのようなので、 Any を選択するメリットはなさそうです。

おまけ1: そもそも sender とは?

「send + er」で、一言でいうと「対象アクションのトリガーとなったUI」です。

例えば上記の @IBAction private func didTapCloseButton(_ sender: UIButton) だと、 sender にはタップされたボタン(メソッド名から「閉じる」ボタンだと推測できる)が格納されています。

メソッド名は自由に付けられますが、私はわかりやすいように、ボタンのタップなら didTap○○Button(_:) と命名しています。

おまけ2: 他の考え方

Twitterなどを見ていると、他にもいろいろな考えを持っている方がいたので紹介します。

  • sender を使わないときは特に意識せず( Any のまま)、使うときのみ具体的な型に変更する
  • sender を使わないときは引数ごと削除し、使うときに引数を追加する

使うときに具体的な型を指定するのを忘れなければ、どちらの考えもいいと思います。
ただ、 IBAction の仕様がわからなくて senderAny のまま使われるのを避けるため、私は常に具体的な型の sender を引数に持たせるのがいいと考えています。

具体的な型の sender があると、どのUIに紐付いたアクションなのかコードから読み取りやすくなるのもあります。

○senderを使わなくても具体的な型にしておくと、どのUIに紐付いているかわかりやすくなる
final class FooViewController: UIViewController {
    // 「これは「閉じる」ボタンタップ時の処理だな!」と `sender` の型とメソッド名からパッと判断できる
    @IBAction private func didTapCloseButton(_ sender: UIButton) {
    }
}
27
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?