web-dev-qa-db-ja.com

Swiftターゲットセレクターによるアクセス制御

このサンプルコードを見てください:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let letterButton = UIButton.buttonWithType(.Custom) as UIButton
        self.view.addSubview(letterButton)
        letterButton.addTarget(self, action:Selector("buttonDidTap:"), forControlEvents: .TouchUpInside)

    }

    func buttonDidTap(button: UIButton!) {
        print(button.char)
    }

}

セレクターがpublicまたはinternalである限り、UIButtonのターゲットアクションは正常に動作しますが、privateの場合、クラッシュします認識されないセレクターがインスタンスに送信されたため

これを達成する方法はありますか?タップ機能をパブリックまたは内部にしたくありません。

43

objcランタイムにプライベートメソッドを公開するには、@objcが必要です

@objc private func buttonDidTap(button:UIButton!) {
    println(button.char)
}

Xcode6 beta4リリースノート から

プライベートとマークされた宣言は、特に注釈がない限り、Objective-Cランタイムに公開されません。 IBアウトレット、IBアクション、およびコアデータ管理プロパティは、アクセスレベルに関係なくObjective-Cに公開されたままです。 Objective-Cから呼び出し可能なプライベートメソッドまたはプロパティが必要な場合(セレクターベースのコールバックを使用する古いAPIなど)、宣言に@objc属性を明示的に追加します。 !

98
Bryan Chen