エラーが出る書き方
以下のように、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のドキュメントを参照してください