カテゴリを使用してクラス(たとえばフレームワーククラス)を拡張できますが、ソースコードを制御しないクラスをカスタムプロトコルの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. 特定のプロトコルを実装するすべてのモジュールを見つけることは可能ですか?
- 3. Android:Contentviewを動的にすることは可能ですか?
- 4. 動的Webページをキャッシュすることは可能ですか?
- 5. AndroidでrawソケットをNDKで実装することは可能ですか?
- 6. パラメータを2つのインターフェイスに実装することは可能ですか?
- 7. ポリマーパック用にWebpack HMRを実装することは可能ですか?
- 8. boost :: thread_specific_ptrをthread_local経由で実装することは可能ですか?
- 9. オープンソースでDRMソフトウェアを実装することは可能ですか?
- 10. Visual Studioで "Vim"トグルを実装することは可能ですか?
- 11. このバックグラウンドスレッドキューは実行可能な実装ですか?
- 12. Android - ビュー内で動的にクリック可能なオブジェクトを移動することは可能ですか?
- 13. IEnumerable <char>にIComparableを実装させることは可能ですか?
- 14. レールでテストを動的に生成することは可能ですか?
- 15. ビジュアルスタジオで動的オブジェクトにインテリセンスを提供することは可能ですか?
- 16. インターフェース(プロトコル、API、フレームワーク)にeXtreme Programmingを適用することは可能ですか?
- 17. FQLを使用してfriends.getMutualFriendsを実装することは可能ですか?
- 18. インターフェイスとドメインオブジェクトを1つのソリューションに含めることは可能ですか?wcfサービスの別のソリューションで実装することは可能ですか?
- 19. Joomlaプラグインを定期的に自動的に実行することは可能ですか?
- 20. ObjectiveCでカスタムクラスのデリゲートを実装するときの参照カウント
- 21. `(Applicative m)=> Applicative(StateT s m)`を実装することは可能ですか?
- 22. 状態バックエンド用のカスタムファイルシステムアダプタを実装することは可能ですか?
- 23. rdlcからグループを動的に削除することは可能ですか?
- 24. 右クリック操作でOnAction()ハンドラを実装することも可能ですか?
- 25. ValidatorCalloutExtenderを動的に配置することは可能ですか?
- 26. VCSから自動的にチェックアウトすることは可能ですか?
- 27. 理論:WebSocket経由で静的コンテンツを提供することは可能か実行可能ですか?
- 28. ObjectiveC/Cでフリーダイヤル・ブリッジを実装する方法は?
- 29. このようなiOSモデルは実装可能ですか?
- 30. asp.net動的データをEF +リポジトリパターンで使用することは可能ですか
サブクラス化してそのプロトコルを追加してみませんか? – kuba
@kuba、それは私が自分自身をインスタンス化するインスタンスだけでなく、フレームワークによって提供される既存のインスタンスに追加したいからです。 – SoftMemes