Правда. Но это не только разрешит методы setter / getter. Как отмечалось в моем предыдущем комментарии, я имею дело с другими классами и методами.
я есть протокол с именем MyProtocol. MyProtocol имеет обязательный метод:
- (NSUInteger)length;
И некоторые другие методы.
Теперь я хочу, чтобы класс NSString соответствовал MyProtocol с категорией. Вот так:
@interface NSString (NSStringWithMyProtocol) <MyProtocol>
@end
В этой категории я реализую все методы, исключая метод 'length', потому что я хочу оригинальную реализацию NSString. Я не хочу переопределять это в этом конкретном классе.
Теперь я получаю предупреждение из-за неполной реализации MyProtocol в категории.
Я знаю, что есть несколько решений, чтобы решить эту проблему.
Сделайте метод необязательнымPointer 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
На этом скриншоте вы можете увидеть мое предупреждение:
Я попытался скомпилировать с LLVM GCC 4.2 и компилятором Apple LLVM 3.0. Я также скомпилировал на xcode 4.0.2 и Xcode 4.2. Я на OS X 10.6.8.