2016-03-23 14 views
1

最近、リテラルセレクターは廃止されました。セレクターがそのクラスに入っていれば、うまくいきます。Objective-Cセレクター廃止予定置換

しかし考える。この例(私は多くのコードを持って、これは簡単な例です):

static func createMenuButton(controller:UIViewController) -> UIBarButtonItem { 
    let menuButton = UIButton(frame: CGRectMake(0, 0, 22, 22)) 
    menuButton.addTarget(controller, action: Selector("menuButtonClicked:"), forControlEvents:.TouchUpInside) 
    let menuButtonContainer = UIView(frame: menuButton.frame) 
    menuButtonContainer.addSubview(menuButton) 
    let menuButtonItem = UIBarButtonItem(customView: menuButtonContainer) 
    return menuButtonItem 
} 

このユーティリティメソッドは私に様々なビュー・コントローラで使用するための良い機能を提供します。その複数の使用のため、新しい#selector構文を使用するには、各ビューコントローラにコピーする必要があります。しかし、アップルは、なぜよりダイナミックな方法を非難する? i++i--、Cスタイルのforループのような新しいリリースでは削除されると思います(ただし、削除する理由はありませんが、簡単に置き換えることはできます)。将来のリリースでこのアプローチを有効にするための回避策はありますか?新しいリリースごとに、私のプロジェクトの構文がすべて破られます。

答えて

2

なぜもっと動的な方法を非難しますか? the proposal to make this changeから

我々は、手動で命名変換を行うと方法が存在するとObjective-Cにさらされていることを確認静的取得することから開発者を解放します。あなたのアプローチのために

、あなたは、特定の方法が存在することを示すプロトコル作ることができます:あなたのビューコントローラで

@objc protocol MenuButtonClickable { 
    func menuButtonClicked() 
} 

を、このメソッドを追加します。

extension MyViewController : MenuButtonClickable { 
    func menuButtonClicked() { 
     // do something 
    } 
} 

その後、あなたの方法を更新このプロトコルを使用する署名:

static func createMenuButton(controller:MenuButtonClickable) -> UIBarButtonItem { 

Swiftコンパイラではcontrollerにそのメソッドがあることが保証されているので、新しい#selector構文を使用できるようになります。

この機能を使用せずに、誤ってこのメソッドをビューコントローラで使用しようとすると、実行時エラーではなくコンパイル時エラーが発生します。

+0

ありがとうございます!あなたのプロトコルメソッドが動作しています。私は既存のクラスに拡張機能を書く必要がなく、まだ機能していないというのは奇妙です。いくつかのメソッドを非推奨にしていますが、私は既にそれを読んでいますが、まだ同意しません...構文を削除すると、私は自分のコードを修正することができますが、それは時間がかかります。また、私は多くのサードパーティのライブラリを使用しています。 – Makalele

+0

@Makalele私はそれがうまくいった! 'extension'は必須ではありません。プロトコルの実装を互いに独立させておくスタイル提案です。私は、スウィフトコードが今後数年間半定期的に崩壊し続けるのではないかと推測しています。もし本当にあなたを迷惑に思っていたら、Objective-Cに戻ってみてください。 –

+0

ええ、私は拡張が必要ではないことを知っていますが、私は少なくともそれを使用しているすべてのクラスでそのプロトコルに従わなければなりません。代わりに私は何もする必要はなく、それは機能しました。 "menuButtonClicked2"の "menuButtonClicked"を変更しても、コンパイル時にエラーは発生しませんでした。しかし、もちろんアプリがクラッシュしたとき、私はそれを引き起こそうとしました。そのコードで@objcキーワードが与える正確な値は? – Makalele

関連する問題