カテゴリを使用してクラス(たとえばフレームワーククラス)を拡張できますが、ソースコードを制御しないクラスをカスタムプロトコルの1つに実装することは可能ですか?インスタンスに送信された場合に特定のメッセージに応答させたいだけでなく、理想的には、プロトコルを照会する際に実行時の型チェックでそのクラスのオブジェクトがtrueを返すようにします。Objective-Cでプロトコルを動的に実装することは可能ですか?
3
A
答えて
8
あなたのような何かをしたいので、あなたは、プロトコルに準拠したカテゴリを定義することができます。
@interface UIWebView (MyGreatExtensions) <UITableViewDelegate>
@end
@implementation UIWebView (MyGreatExtensions)
- (CGFloat)tableView: (UITableView *)tableView heightForRowAtIndexPath: (NSIndexPath *)indexPath {
return 42.0;
}
// ...
@end
を検討するために小さなエッジケースは、(他のもし誰かが同じことをしようとするということですサードパーティ製のフレームワークもカテゴリを介してプロトコルを追加します)バージョンが使用されることは保証できません。
このアプローチに関する詳細from Mark Dalrymple。
1
これは可能だと思います。 NSObjectのforwardInvocation:メソッドを上書きし、プロトコルの実装者が応答するすべての認識されないメッセージを傍受することで、Objective-Cで動的プロキシを簡単に作成できます(これはNSUndoManagerの魔法の仕組みです)。私はこれを自分でやったことがないので、これを行うよりエレガントな方法があるかもしれません。
また、あなたのオブジェクトは、プロトコルを実装しないことに同意することにランタイムチェックを欺くために、あなたはNSObjectののクラスメソッドconformsToProtocolをオーバーライドすることもできますので、のように:
+ (BOOL)conformsToProtocol:(Protocol *)aProtocol {
if (aProtocol == @protocol(MyDynamicallyImplementedProtocol))
return YES;
return [super conformsToProtocol:aProtocol];
}
あなたがオーバーライドする必要が複数のメソッドがあるかもしれません1つの例は、NSObjectのinstancesRespondToSelector:とresolve *:メソッドです。詳細については、NSObject class referenceを調べてください。
関連する問題
- 1. c#app:JSONインターフェイスを実装することは可能ですか?
- 2. Fragmentactivityにオーバーフローメニューを実装することも可能ですか
- 3. 特定のプロトコルを実装するすべてのモジュールを見つけることは可能ですか?
- 4. Android:Contentviewを動的にすることは可能ですか?
- 5. 動的Webページをキャッシュすることは可能ですか?
- 6. AndroidでrawソケットをNDKで実装することは可能ですか?
- 7. 差動リンクを実行することは可能ですか?
- 8. アンドロイドにadobe flash playerを実装することは可能ですか?
- 9. ポリマーパック用にWebpack HMRを実装することは可能ですか?
- 10. カスタムforeachにLaravelページネーションを実装することは可能ですか
- 11. ListView内にItemTemplateを実装することは可能ですか?
- 12. パラメータを2つのインターフェイスに実装することは可能ですか?
- 13. Spring統合:ServiceActivatorメソッドでトランザクションを実装することは可能ですか?
- 14. React.jsで指紋認証を実装することは可能ですか
- 15. PHPで仮想パスを実装することは可能ですか?
- 16. boost :: thread_specific_ptrをthread_local経由で実装することは可能ですか?
- 17. Visual Studioで "Vim"トグルを実装することは可能ですか?
- 18. オープンソースでDRMソフトウェアを実装することは可能ですか?
- 19. タッチイベントで「入力」イベント検出を実装することは可能ですか?
- 20. このバックグラウンドスレッドキューは実行可能な実装ですか?
- 21. 明示的に実装されたインターフェイスプロパティでクラスをjson-serializeすることは可能ですか?
- 22. Android - ビュー内で動的にクリック可能なオブジェクトを移動することは可能ですか?
- 23. アンドロイドで展開可能なリストビューの子ビュー内でlistviewを実装することは可能ですか?
- 24. IEnumerable <char>にIComparableを実装させることは可能ですか?
- 25. FQLを使用してfriends.getMutualFriendsを実装することは可能ですか?
- 26. レールでテストを動的に生成することは可能ですか?
- 27. ビジュアルスタジオで動的オブジェクトにインテリセンスを提供することは可能ですか?
- 28. ObjectiveCでカスタムクラスのデリゲートを実装するときの参照カウント
- 29. インターフェース(プロトコル、API、フレームワーク)にeXtreme Programmingを適用することは可能ですか?
- 30. インスタントメッセージングにFTPプロトコルを使用することは可能ですか?
サブクラス化してそのプロトコルを追加してみませんか? – kuba
@kuba、それは私が自分自身をインスタンス化するインスタンスだけでなく、フレームワークによって提供される既存のインスタンスに追加したいからです。 – SoftMemes