Правда. Но это не только разрешит методы 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.

Ответы на вопрос(2)

Ваш ответ на вопрос