エラーが出る書き方
以下のように、private func
で定義されたmethodは呼ぼうとした時クラッシュします
実装例
MyViewController.swift
// 略
override func viewDidLoad() {
super.viewDidLoad()
self.button.addTarget(self, action: "buttonAction", forControlEvents: .TouchUpInside)
}
private func buttonAction() {
print("Hello.")
}
// 略
Errorの内容
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[TestProject.MyViewController buttonAction]: unrecognized selector sent to instance 0x12f1ca000'
いわゆる「methodが見つかりません」というやつです
もちろんprivate
を外すと問題ありません
エラーが出ない書き方
MyViewController.swift
// 略
dynamic private func buttonAction() {
print("Hello.")
}
// もしくは
@objc private func buttonAction() {
print("Hello.")
}
// 略
個人的にはSwiftコードの中に突然@
が出てくるのが嫌なのでdynamic
修飾子を付けています
@objc
を付けるという意味では、自動で@objc
がつくタイプのもの(@IBOutlet
, @IBAction
, or @NSManaged
)を使っても一応解決できると思います
@objc
とdynamic
の違いや、エラーが出なくなる細かい理由については、objc_msgSend
がどーのこーのということになるのですが、詳しくはAppleのドキュメントを参照してください