카테고리가 동시에 프로토콜을 구현할 수 있습니까?
-
11-09-2019 - |
문제
클래스를 위해 작성하는 카테고리에 프로토콜이 설정 한 계약을 충족하는 메소드를 추가하는 경우 해당 카테고리 클래스를 프로토콜 구현으로 표시하고 OBJ-C 사전 프로세서에 클래스는 프로토콜을 효과적으로 구현합니다.
예제 대의원 (명확성, 감사합니다 Ole!) :
@protocol SomeDelegate <NSObject>
- (void)someDelegateMessage;
@end
예제 카테고리 :
@interface NSObject (SomeCategory) <SomeDelegate>
- (void)someDelegateMessage;
@end
그리고 다른 일반적인 구현으로
@implement NSObject (SomeCategory)
- (void)someDelegateMessage {}
@end
실제로 이것을 시도하면 각 nsobject 메소드에 대해 경고를받습니다.
경고 : 불완전한 범주 'SomeCategory'구현
경고 : '-description'에 대한 메소드 정의를 찾을 수 없습니다.
...
경고 : '-isequal :'찾을 수 없음에 대한 메소드 정의
경고 : 카테고리 'SomeCategory'
제거하면 잘 작동합니다 <SomeDelegate>
선언에서 나오지만 물론 NSOBJECT는 서도적으로 인식되지 않습니다.
해결책
해결 방법은 구현이없는 카테고리에서 프로토콜을 선언하고 다른 범주에서 메소드를 구현하는 것입니다.
@interface NSObject (SomeCategory) <SomeDelegate>
- (void)someDelegateMessage;
@end
@implementation NSObject (SomeCategory_Impl)
- (void)someDelegateMessage {}
@end
이렇게하면 NSObject
일치하는 것으로 간주됩니다 <SomeDelegate>
컴파일 타임 및 런타임 확인 someDelegateMessage
성공할 것입니다. 하지만, conformsToProtocol:
런타임 확인이 실패합니다.
물론, 당신은해야합니다 버그를 제출하십시오 핵심 클래스에서 선언 된 방법을 요청하면 경고가 발생하지 않습니다.
다른 팁
프로토콜 선언에 포함 가능합니다 NSObject
규약? 이와 같이:
@protocol SomeDelegate <NSObject>
...
그곳에서 경고가 나오는 곳입니다. 이제 귀하의 카테고리가 전체 프로토콜을 구현하지 않기 때문입니다. 방금 입력 한 테스트 코드에서 제거 NSObject
프로토콜에서 컴파일러 경고가 제거됩니다.
컴파일러가 전송에 대해 닥치기를 원한다면u003CNSObject> 메시지 (그리고 클래스 이름이 아닌 프로토콜 이름이라는 것을 기억하는 것이 중요합니다) 그런 다음 컴파일러에게 명시 적으로 말하는 'ID'변수를 사용합니다. .
또는 nsObject를 대신 변수 유형으로 사용하십시오.