既存のプロトコルに別の方法を拡張または追加したいと考えています。特にプロトコルは重要ではありませんが、これが私がやろうとしていることです。ココアの既存のプロトコルにメソッドを追加するには?
@protocol NSMatrixDelegate
- (void)myNewMethod:(id)sender;
@end
コンパイラは、私は同じプロトコルの重複した宣言を持っていることを警告しています。どのように私はこれを正しく行うでしょうか?
ありがとうございました。
既存のプロトコルに別の方法を拡張または追加したいと考えています。特にプロトコルは重要ではありませんが、これが私がやろうとしていることです。ココアの既存のプロトコルにメソッドを追加するには?
@protocol NSMatrixDelegate
- (void)myNewMethod:(id)sender;
@end
コンパイラは、私は同じプロトコルの重複した宣言を持っていることを警告しています。どのように私はこれを正しく行うでしょうか?
ありがとうございました。
プロトコルのカテゴリを定義することはできません。
をチェックする非公式のプロトコルおよびランタイムを使用し、次のようになります。この周りの2通りの方法があります。
@protocol MyCustomMatrixDelegate <NSMatrixDelegate>
- (void) myNewMethod:(id)sender;
@end
次に、カスタムクラスをo <NSMatrixDelegate>
の代わりに<MyCustomMatrixDelegate>
です。このアプローチを使用する場合は、注意が必要なことがあります。[self delegate]
はおそらくid<NSMatrixDelegate>
と宣言されます。これは、<NSMatrixDelegate>
がmyNewMethod:
メソッドを宣言していないため、[[self delegate] myNewMethod:obj]
を実行できないことを意味します。
これを回避する方法は、キャストを介してdelegate
オブジェクトを再入力することです。多分何か:
- (id<MyCustomMatrixDelegate>) customDelegate {
return (id<MyCustomMatrixDelegate>)[self delegate];
}
(ただし、あなたが同じように、最初のチェックのいくつかのタイプをしたいかもしれません:
if ([[self delegate] conformsToProtocol:@protocol(MyCustomMatrixDelegate)]) {
return (id<MyCustomMatrixDelegate>)[self delegate];
}
return nil;
)
そして、あなたは何だろう:
[[self customDelegate] myNewMethod:obj];
を
これは本当にNSObject
上のカテゴリの空想名前です:
@interface NSObject (MyCustomMatrixDelegate)
- (void) myNewMethod:(id)sender;
@end
次に、あなただけのメソッドを実装していません。メソッドを送信するクラスでは、次のようにします。
if ([[self delegate] respondsToSelector:@selector(myNewMethod:)]) {
[[self delegate] myNewMethod:someSenderValue];
}
私は正式なプロトコルメソッドを試しました。これは動作しますが、コンパイラはカスタムメソッドがプロトコルで見つからないことを警告します。私は、代理人のインターフェイスに正式なプロトコルを追加し、デリゲートのメッセージを送信しているオブジェクトの実装ファイルに代理人のヘッダーを含めました。あなたはまだそれが不平を言っている理由を知っていますか?ありがとう – David
@David編集の回答 –
あなたは素晴らしいです。魅力のように動作します。ありがとうございました。 – David