2011-01-08 4 views
6

다른 프로토콜을 확장하거나 기존 프로토콜에 추가하려고합니다. 특히 프로토콜은 중요하지 않지만, 이것은 내가하려고하는 것입니다.코코아에서 기존 프로토콜에 메소드를 추가하는 방법은 무엇입니까?

@protocol NSMatrixDelegate 
- (void)myNewMethod:(id)sender; 
@end 

컴파일러는 동일한 프로토콜의 중복 된 선언이 있음을 경고합니다. 어떻게하면 제대로 할 수 있을까요?

감사합니다.

답변

12

프로토콜의 범주를 정의 할 수 없습니다.

  • 사용하는 새로운 형식 프로토콜
  • 새로운 형식 프로토콜을 정의

공식 프로토콜

을 확인 비공식 프로토콜과 런타임을 사용 같을 것이다 :이 약 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]; 
} 
+0

형식 프로토콜 메소드를 시도했습니다. 그것은 작동하지만 컴파일러는 사용자 정의 메소드가 프로토콜에서 발견되지 않는다고 경고합니다. 공식 프로토콜을 대리인의 인터페이스에 추가하고 대리인의 헤더를 objet 메시지를 보내는 objet의 구현 파일에 포함 시켰습니다. 왜 그것이 여전히 불평하고 있는지 알 수 있습니까? 감사합니다 – David

+0

@ David 수정 된 답변 –

+0

당신은 훌륭합니다. 매력처럼 작동합니다. 고맙습니다. – David

관련 문제