iphone, как указать тип данных класса должны принять к протоколу - PullRequest
2 голосов
/ 19 июля 2010

В моем приложении мне нужно вернуть «Класс» в качестве типа возврата, например:

Application.m:

+ (Class)getParserClass {
  return [NCCurrencyParser class];
}

NCCurrencyParser.m:

@interface NCCurrencyParser NSObject <NCParser>
@protocol NCParser
  +(NSNumber *)parserNumber:(NSNumber *)number;

в методе вызова:

Class parserClass = [Application getParserClass];
[parserClass parserNumber:1.0];

Но тогда компилятор выдаст мне ошибку, что parserClass может не отвечать на parseNumber.Как я могу заставить Класс принять какой-то протокол, например: Class <NCParser> (но он не работает)

Ответы [ 3 ]

3 голосов
/ 19 июля 2010

Объекты класса в Objective-C являются объектами первого класса и могут реализовывать протоколы, как и любой другой объект Objective-C (id, NSObject *, ...)

Так что просто делайте то, что вы обычно делаете для любого другого протокола объекта, то есть:

+ (Class<NCParser>)getParserClass {
  return [NCCurrencyParser class];
}

И

Class<NCParser> parserClass = [Application getParserClass];
[parserClass parserNumber:1.0];

Сборка / сборка / тестирование на xcode 3.2.3, iPhone Simulator 4.0, GCC 4.2

1 голос
/ 19 июля 2010

Что происходит ... это кажется ОЧЕНЬ неправильным.

Но выполнение Class<NCParser> parserClass = [Application getParserClass]; должно работать

0 голосов
/ 19 июля 2010

"Но тогда компилятор выдаст мне ошибку, что parserClass может не отвечать на parseNumber"

Если вам просто нужно игнорировать сообщение об ошибке.Поместите это в класс, который имеет метод вызывающего:

#import "NCParser.h"

решит вашу проблему.Это просто работает!

Я думаю, XCode основывается на вашем импорте, чтобы определить методы для Class.

.Класс "

Вы можете проверить NCObject или id на соответствие протоколу во время компиляции, используя id <AProtocol>.Но я не думаю, что вы можете сделать это для Class объекта.

Мой подход - проверить это во время выполнения.Как это:

NSObject *object = [[class alloc] init];
NSAssert ([object conformsToProtocol:@protocol(AProtocol)], 
          @"`class` should conform AProtocol");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...