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")
}
*/
}