#selector の中の関数に、パラメータを使ってはいけない理由
画面の中心にボタンを置き、そのボタンの繋がったクリック関数に
パラメータを使用してみます
しかし、実際にそのボタンをクリックすると
number 5
がプリントされてなく
number 4527816368
がプリントされてしまいました
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let button = UIButton(type: .system)
button.setTitle("Click me", for: .normal)
button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
button.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(button)
button.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
button.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
}
@objc func buttonTapped(number: Int = 5) {
print("number", number) // number 4527816368
}
}
addTarget()
の第一のパラメータ
func buttonTapped()
を以下のように修正して、パラメータをもっと詳しくみてみましょう
@objc func buttonTapped(first: Any) {
print("first", first)
}
そしてボタンをクリックしたら
このようなものがプリントされました
どうやらUIButton
そのものがプリントされました
文章の冒頭の4527816368
は、その返すべきのUIButton
が、Int
に変換され
<UIButton>
→4527816368
のような数字が返されました
addTarget()
の第二のパラメータ
もういっちょ試して、第二のパラメータを加えてみると
@objc func buttonTapped(first: Any, second: Any) {
print("second", second)
}
今回はタッチ事件が返したようです
まとめ
addTarget()
が使用した#selector()
には
独自のパラメータが限定されたようです
- 第一のパラメータは
UIButton
- 第二のぱあメータは
UIEvent
以上の事実を踏まえて、コードの可読性を向上してみます
@objc func buttonTapped(button: UIButton, event: UIEvent) {
print(button)
print(event)
}
結論
場合によりますが
少なくとも、addTarget()
では
#selector()
にカスタイムパラメータの使用は不可のようです
Author And Source
この問題について(#selector の中の関数に、パラメータを使ってはいけない理由), 我々は、より多くの情報をここで見つけました https://zenn.dev/ianchen0419/articles/6223b822826efc著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Collection and Share based on the CC protocol