LoginSignup
24
20

More than 5 years have passed since last update.

privateメソッドをSelectorとして指定する場合は@objcが必要

Posted at

Target-ActionモデルのAPIを使うとき、Actionに指定するメソッドはPrivateにしたいけど、その場合 @objc 付けないと実行時エラーになる。

swift
class MyViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        navigationItem.leftBarButtonItem = UIBarButtonItem(
            barButtonSystemItem: UIBarButtonSystemItem.Done,
            target: self,
            action: "test"
        )
    }

    //OK
    @objc private func test() {
        println("test")
    }

    /*
    //NG
    private func test() {
        println("test")
    }

    //OK
    func test() {
        println("test")
    }

    //OK
    public func test() {
        println("test")
    }
    */
}

objcクラスを継承したクラスであっても、Privateメソッドはobjcにexposeされないので明示的に@objcつけてやる必要があるらしい。internal/publicであれば@objcしなくてもよいらしい。

ちなみにobjcクラスを継承していないクラスのメソッドをSelectorで指定する場合はAccess Controlにかかわらず@objcは必須。

swift
class PureSwiftClazz {

    func setup() {
        NSNotificationCenter.defaultCenter().addObserver(self,
            selector: "test",
            name: UIApplicationWillEnterForegroundNotification,
            object: nil)
    }

    //OK
    @objc private func test() {
        println("test")
    }

    /*
    //NG
    private func test() {
        println("test")
    }

    //NG
    func test() {
        println("test")
    }

    //NG
    public func test() {
        println("test")
    }
    */
}
24
20
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
24
20