다른 프로토콜을 확장하거나 기존 프로토콜에 추가하려고합니다. 특히 프로토콜은 중요하지 않지만, 이것은 내가하려고하는 것입니다.코코아에서 기존 프로토콜에 메소드를 추가하는 방법은 무엇입니까?
@protocol NSMatrixDelegate
- (void)myNewMethod:(id)sender;
@end
컴파일러는 동일한 프로토콜의 중복 된 선언이 있음을 경고합니다. 어떻게하면 제대로 할 수 있을까요?
감사합니다.
다른 프로토콜을 확장하거나 기존 프로토콜에 추가하려고합니다. 특히 프로토콜은 중요하지 않지만, 이것은 내가하려고하는 것입니다.코코아에서 기존 프로토콜에 메소드를 추가하는 방법은 무엇입니까?
@protocol NSMatrixDelegate
- (void)myNewMethod:(id)sender;
@end
컴파일러는 동일한 프로토콜의 중복 된 선언이 있음을 경고합니다. 어떻게하면 제대로 할 수 있을까요?
감사합니다.
프로토콜의 범주를 정의 할 수 없습니다.
을 확인 비공식 프로토콜과 런타임을 사용 같을 것이다 :이 약 2 가지 방법이 있습니다 :
@protocol MyCustomMatrixDelegate <NSMatrixDelegate>
- (void) myNewMethod:(id)sender;
@end
그러면 사용자 정의 클래스를 t o <NSMatrixDelegate>
대신 <MyCustomMatrixDelegate>
. 이 접근 방식을 사용하는 경우 알아 둘 사항이 있습니다. [self delegate]
은 id<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];
}
형식 프로토콜 메소드를 시도했습니다. 그것은 작동하지만 컴파일러는 사용자 정의 메소드가 프로토콜에서 발견되지 않는다고 경고합니다. 공식 프로토콜을 대리인의 인터페이스에 추가하고 대리인의 헤더를 objet 메시지를 보내는 objet의 구현 파일에 포함 시켰습니다. 왜 그것이 여전히 불평하고 있는지 알 수 있습니까? 감사합니다 – David
@ David 수정 된 답변 –
당신은 훌륭합니다. 매력처럼 작동합니다. 고맙습니다. – David