Приведение класса в соответствие с категорией для существующих методов - PullRequest
13 голосов
/ 31 августа 2011

У меня есть протокол с именем MyProtocol.MyProtocol имеет обязательный метод:

- (NSUInteger)length;

и некоторые другие методы.

Теперь я хочу, чтобы класс NSString соответствовал MyProtocol с категорией.Вот так:

@interface NSString (NSStringWithMyProtocol) <MyProtocol>
@end

В этой категории я реализую все методы, кроме метода length, потому что я хочу оригинальную реализацию NSString.Я не хочу переопределять его в этом конкретном классе.

Теперь я получаю предупреждение из-за неполной реализации MyProtocol в категории.

Я знаю, что есть несколько решений для решения этой проблемы..

  1. Сделать метод необязательным
  2. Указатель Swizzling
  3. Добавление подкласса в класс, соответствующий протоколу.Затем опустите реализацию.

Я не хочу использовать эти опции, потому что они приводят к плохому дизайну для остальной части моего кода.
Опция 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

Я попытался скомпилировать с помощью LLVM GCC 4.2 и компилятора Apple LLVM 3.0.Я также скомпилировал на xcode 4.0.2 и Xcode 4.2.Я на OS X 10.6.8.

Ответы [ 2 ]

9 голосов
/ 02 сентября 2011

Я не могу воспроизвести эту проблему.Можете ли вы опубликовать код, который демонстрирует это?Следующие компиляции без предупреждений на 10.7.

#import <Foundation/Foundation.h>

@protocol MyProtocol <NSObject>
- (NSUInteger)length;
@end

@interface NSString (NSStringWithMyProtocol) <MyProtocol>
@end

int main (int argc, const char * argv[]) {
  @autoreleasepool {
    id<MyProtocol> foo = @"foo";
    NSLog(@"%@", foo);    
  }
  return 0;
}
0 голосов
/ 31 августа 2011

Вы можете посчитать это хаком, и я не знаю, сработает ли он вообще, но как насчет объявления его как свойства только для чтения

@property (readonly, assign) NSUInteger length;

и затем в реализации вашей категории, сделайте это @dynamic

...