Swiftで、iOSアプリを開発しています。
すらすら書けるようになると気持ちいいですし、Objective-Cと比較してコードの量が減ったので開発スピードも少しはアップしている気がします。
そこそこ込み入ったアプリを作っていくと、ノウハウも溜まってくるんじゃないかと考えています。
さっきも何だか上手くいかなかったことがありました。
NSNotificationCenterのaddObserverで通知を受けようとするとUnrecognized selector sent to instance
とエラーが出てセレクタが見つからないと言われアプリが止まってしまうのです。
Swiftになってからは、Objective-Cでは@selecter(セレクタ名)
で指定していたセレクタは、ただの文字列として指定することになっていて、(内部的にはstructになっているようですが。)これを素直に指定しているとアプリがエラーになってしまいました。
これは、addObserverForNameなら問題ないのであまり重要視していませんでした。
しかし、やっぱり気持ち悪いので色々と調べていくと解決方法が分かりました。
まず、メソッドをprivateにするのをやめることで、解決できます。
状況によってはエラーが出ないのは何でだろうと考えて、まずprivateがマズイのではないかというところに辿りつきました。
privateにすることで他のファイルのオブジェクトからは見えなくなるという現象であるという理解をしました。
しかし、これは完璧な対応策とは言えません。
やはり、公開するメソッドは最小限にとどめて他は、隠蔽しておきたいものですしね。
他にも方法があるんじゃないかと、ググってみるとありました。
NSNotificationCenterは、Objective-CのオブジェクトでSwift化されていないのかよくわかりませんが、@objcの指定子をつけてメソッドを見えるようにする必要があるようです。
納得のいく内容だったので、それを反映すると無事コードが実行されました。