の定義カテゴリのためのプロトコルにObjective-C?
-
19-09-2019 - |
質問
にObjective-Cでの追加方法は、既存のクラスカテゴリなどの
@interface NSString (MyCategory)
- (BOOL) startsWith: (NSString*) prefix;
@end
でも可能なプロトコル、すなわち場合がありましたNSStringプロトコルのようなもの:
@interface <NSString> (MyCategory)
- (BOOL) startsWith: (NSString*) prefix;
@end
こういう仕事がしたいてい複数の拡張子をNSObject(クラス)、公共NSObject方法、その拡張もにオブジェクトの実施、プロトコルです。
この例になっているのでしょうか?書きたいな方法logDescription印刷したいオブジェクトの説明サーバー機能の利用を選択:
- (void) logDescription {
NSLog(@"%@", [self description]);
}
私のコースに追加このメソッドをNSObjectあるが、その他のクラスからは継承しませんNSObject、また、この方法、例えばNSProxy.らの方法だけを使用しpublicメンバのプロトコルでベストへの追加のためにプロトコルです。
編集:Java8現在、この"仮想内線方法"にインターフェイス: http://cr.openjdk.java.net/~briangoetz/λ/Df%20Methods%20v4.pdf.これはどのような目的-C.光景は見られなかったこの質問得こだわり---
について Jochen
解決
extObjCのNEATESTもの まなプロトコルを分析し...第off @concreteprotocol
...
- を定義する"コンクリートプロトコル"を提供できるデフォルトの実装方法内のプロトコルです。
- An
@protocol
ブロックは存在するヘッダファイルに対応する@concreteprotocol
ブロック実装ファイルです。 - Anyオブジェクトを宣言するそのものに準拠してこのプロトコルを受ける方法は実装にだけない場合の方法による同じ名前で作成するときに役に立ちます。
MyProtocol.h
@protocol MyProtocol
@required - (void)someRequiredMethod;
@optional - (void)someOptionalMethod;
@concrete - (BOOL)isConcrete;
MyProtocol.m
@concreteprotocol(MyProtocol) - (BOOL)isConcrete { return YES; } ...
で宣言するオブジェクト MyDumbObject : NSObject <MyProtocol>
自動的に戻り YES
へ isConcrete
.
また、い pcategoryinterface(PROTOCOL,CATEGORY)
する"を定義するインタフェースカテゴリ名はカテゴリプロトコルプロトコル".プロトコルカテゴリを含む方法は、自動的に付加されるクラスを宣言するそのものに準拠してプロトコルです。" あに伴うマクロまでの使用実装がファイルです。のdocsに入ります。
最後に、ななし 直接 関連 @protocols
は
synthesizeAssociation(CLASS, PROPERTY)
, は、"成建てシェアハウスがオープンクラスの使用に関連オブジェクト。これは、主として有用物件の追加をクラス内です。財て宣言されて @property
インターフェースの指定されたクラス(または区分し、それらをもとに、必要のオブジェクトタイプです。"
多くの のツールこのライブラリ開(かどう)のものができObjC...から複数の遺...に、知識がなくても大丈夫。
他のヒント
短い答え:いいえ。
長い答え:どのようにこの作品でしょうか?あなたがを想像しての既存のプロトコルにメソッドを追加することができますか?これはどのように働くのでしょうか?我々はNSCodingに別のメソッドを追加したい想像して、このメソッドは、オブジェクトを符号化するために使用されるキーの配列を返す必要な方法である-(NSArray *) codingKeys;
言うます。
問題はすでにNSCodingを実装するが、私たちのcodingKeys
メソッドを実装していない既存のクラスは、(のような、NSStringのを言う)があるということです。何が起こるのでしょうか?どのようにプリコンパイルされたフレームワークは、この のそれを実装していないクラスにメッセージを送信される必要なときに?
あなたは「私たちはカテゴリーを経由して、このメソッドの定義を追加することができます」または「我々はこれらのプロトコルのカテゴリを経て追加されたメソッドを明示的にオプションであることを言うことができる」と言うことができます。はい、あなたはこれを行うと、理論的には、私が上記しました問題を回避することができます。あなたはそれをやろうとしているなら、あなたにもちょうどその最初の場所でのカテゴリ行い、その後、メソッドを呼び出す前に、必ずクラスrespondsToSelector:
を作るためにチェックすることがあります。
は、コードのみに適用されるようにカテゴリを定義することができます所望のプロトコルを有する所与のタイプのオブジェクト(ソートのようなC ++のテンプレートの部分特殊化)。
あなたはクラスのカスタマイズバージョンに依存カテゴリを定義したいときこのような何かのための主な使用です。 (私は彼らがfooプロパティを持っている意味、Fooのプロトコルに準拠するのUIViewControllerのサブクラスを持っていることを、私のカテゴリーコードは、fooプロパティの必要性があるかもしれませんが、私はFooのプロトコルに適用することはできません、と私は単純にそれを適用した場合を想像してみてUIViewControllerに、コードはデフォルトでコンパイルし、コンパイルして、それを強制することは、誰かが、プロトコルに依存して、あなたのコードを呼ぶかもしれない、イントロスペクションを行う、あるいは単に台無しに意味はありませんハイブリッドアプローチは次のように仕事ができる:ます。
@protocol Foo
- (void)fooMethod
@property (retain) NSString *foo;
@end
@implementation UIViewController (FooCategory)
- (void)fooMethod {
if (![self conformsToProtocol:@protocol(Foo)]) {
return;
}
UIViewController<Foo> *me = (UIViewController<Foo>*) self;
// For the rest of the method, use "me" instead of "self"
NSLog(@"My foo property is \"%@\"", me.foo);
}
@end
ハイブリッドアプローチを使用すると、(プロトコルを実装することになっているクラスごとに)一度だけのコードを書いて、それがプロトコルに準拠していないクラスのインスタンスに影響を与えないことを確認することができます。
欠点は、プロパティ合成/定義はまだ個々のサブクラスで発生することがあるということです。
そうするのはとても意味がありません。プロトコルは、あなたには、いくつかの方法をサポートすることを宣言する方法です。プロトコル外このリストにメソッドを追加すると、彼らはそれを実装していないにもかかわらず、すべての「準拠」のクラスが誤って新しいメソッドを宣言することを意味します。いくつかのクラスはNSObjectのプロトコルを実装しますがNSObjectのから派生していなかった、とあなたはプロトコルにメソッドを追加した場合、そのクラスの適合性を破るます。
あなたが、しかし、@protocol SpecialObject <NSObject>
のような宣言と古いものを含む新しいプロトコルを作成することができます。
と思いき起用だけではないことを知りました。拡張機能、プロトコル、インタフェースおよびクラスはすべて別のもので、Objective-Cに のObjective-C2.0語 Appleの違い、などの利点や欠点をカテゴリや拡張機能
考えてみれば、何である"カテゴリー"または"拡張子"の概念です。この方への機能の追加ができます。にObjective-C、プロトコルを設計して実装されます。そのため、あなたは何点ぐらいになると思い追加又は延長を実施するものな実施を開始す。
あなたはすでにカテゴリを書いているならば、なぜちょうど右のカテゴリ定義した後、ヘッダー内のプロトコル定義に追加しない?
すなわちます。
@interface NSString (MyCategory)
- (BOOL) startsWith: (NSString*) prefix;
@end
@protocol MyExtendedProtocolName <NSString>
//Method declarations go here
@end
この方法カテゴリのヘッダをインポートするすべてのクラスは、プロトコルの定義を取得します、あなたは、あなたのクラスにそれを追加することができます..
@interface MyClass <OriginalProtocol,MyExtendedProtocolName>
また、NSStringのをサブクラス化するとき、それはクラスタだとあなたはいつもあなたが期待している動作を取得することはできませんように注意してください。
アダム-急 掲載して解 勤務している。
この3ステップ:
- を定義する方法として追加す
@optional
るプロトコルです。 - の物したいの拡張に適合するプロトコルです。
- 複写の方法にそれらのオブジェクトを行います。
チェックのリンクの詳細