У меня есть протокол с именем MyProtocol.MyProtocol имеет обязательный метод:
- (NSUInteger)length;
и некоторые другие методы.
Теперь я хочу, чтобы класс NSString соответствовал MyProtocol с категорией.Вот так:
@interface NSString (NSStringWithMyProtocol) <MyProtocol>
@end
В этой категории я реализую все методы, кроме метода length, потому что я хочу оригинальную реализацию NSString.Я не хочу переопределять его в этом конкретном классе.
Теперь я получаю предупреждение из-за неполной реализации MyProtocol в категории.
Я знаю, что есть несколько решений для решения этой проблемы..
- Сделать метод необязательным
- Указатель Swizzling
- Добавление подкласса в класс, соответствующий протоколу.Затем опустите реализацию.
Я не хочу использовать эти опции, потому что они приводят к плохому дизайну для остальной части моего кода.
Опция 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
На этом снимке экрана вы можетесм. мое предупреждение: ![Screen shot](https://i.stack.imgur.com/qG1V9.png)
Я попытался скомпилировать с помощью LLVM GCC 4.2 и компилятора Apple LLVM 3.0.Я также скомпилировал на xcode 4.0.2 и Xcode 4.2.Я на OS X 10.6.8.