У меня есть протокол по имени MyProtocol. MyProtocol имеет необходимый метод:
- (NSUInteger)length;
и некоторые другие методы.
Теперь я хочу сделать класс NSString, соответствующий MyProtocol с категорией. Вроде так:
@interface NSString (NSStringWithMyProtocol) <MyProtocol>
@end
В этой категории я реализую все методы, исключая метод «длины», поскольку я хочу исходную реализацию NSString. Я не хочу переопределять его в этом конкретном классе.
Теперь я получаю предупреждение из-за неполной реализации MyProtocol в категории.
Я знаю, что есть несколько решений для решения этого.
Я не хочу использовать эти варианты, потому что они приводят к плохому дизайну для остальной части моего кода.
Вариант 3 плохой, из-за существующих прямых подклассов не будет соответствовать протоколу.
Кто-нибудь знает, как удалить предупреждение без реализации метода длины?
Примечание: Класс, категория и протокол являются лишь примерами. Я столкнулся с этой проблемой с другими классами, о которых я не мог публиковать. Спасибо
Редактировать: добавлен третий вариант.
Полный код:
Протокол:
@protocol MyProtocol <NSObject>
- (void) myMethod;
- (NSInteger) length;
@end
Заголовок категории:
#import <Foundation/Foundation.h>
#import "MyProtocol.h"
@interface NSString (MyProtocol) <MyProtocol>
@end
Реализация категории:
@implementation NSString (MyProtocol)
- (void)myMethod {
}
@end
Это приводит к следующим предупреждениям.
Incomplete implementation
Method in protocol not implemented
На этом скриншоте вы можете увидеть мое предупреждение:
Я пытался компилировать LLVM GCC 4.2 и компилятор Apple LLVM 3.0. Я также скомпилировал на XCode 4.0.2 и XCode 4.2. Я на ОС х 10,6,8.