категории для протоколов и предупреждений класс не реализует протокол

Ну, у меня есть эти два протокола:

@protocol ivAuthorizationProtocol <NSObject>
-(void)loginReply:(ivSession*)session;
@end
@protocol ivServerListsProtocol <NSObject>
-(void)serverListLoaded:(NSArray*)serverList;
@end

и есть класс

@interface ivClientAppDelegate : NSObject <UIApplicationDelegate>
...
@end
@implementation
...
-(void)authorizeWithLogin:(NSString*)login andPassword:(NSString*)password
{
    self.login = login;
    self.password = password;
    // !!! delegate in the next call should conform to ivAuthorizationProtocol, 
    // so i get warning "class does not implement protocol ivAuthoriaztionProtocol" here
    [_apiWrapper authorizeWith:login andPassword:password forDelegate:self]; 
}
...
@end

Я хочу поместить реализацию методов протокола в отдельные файлы (категории), чтобы не засорять основной файл реализации. Например, заголовок категории для реализации ivAuthorizationProtocol выглядит так:

#import "ivClientAppDelegate.h"

@interface ivClientAppDelegate (ivAuthorizationResponder) <ivAuthorizationProtocol>
-(void)loginReply:(ivSession*)session;
@end

Итак, вопрос - как я могу избавиться от предупреждения, которое я получаю в основном файле реализации? Как я могу сообщить компилятору, что методы, соответствующие протоколу, расположены в категориях? Заранее спасибо!


person peetonn    schedule 15.07.2011    source источник
comment
Вы импортировали заголовочные файлы категорий?   -  person Deepak Danduprolu    schedule 15.07.2011
comment
да, я импортировал их. но если я импортирую ivAuthorizationProtocol в основную реализацию, я получу предупреждение о том, что методы ivAuthorizationProtocol не реализованы, что тоже нехорошо =\   -  person peetonn    schedule 15.07.2011


Ответы (3)


Вы можете использовать приведение, чтобы отключить предупреждение:

[_apiWrapper
    authorizeWith:login
    andPassword:password
    forDelegate:(id<ivAuthorizationProtocol>)self
];

Кроме этого, вы не можете делать то, что хотите, не получая различных предупреждений (нереализованные методы). Обычно вы указываете протокол в интерфейсе:

@interface ivClientAppDelegate : NSObject <UIApplicationDelegate,ivAuthorizationProtocol

Но тогда вам нужно будет реализовать методы в вашем основном блоке @implementation.

Обратите внимание, что по соглашению имена классов и протоколов должны начинаться с заглавной буквы.

person DarkDust    schedule 15.07.2011

Почему бы вам не подумать о том, чтобы сделать это следующим образом:

         @interface ivClientAppDelegate : NSObject <UIApplicationDelegate, ivAuthorizationProtocol >
person Vijay-Apple-Dev.blogspot.com    schedule 15.07.2011
comment
поэтому мне придется реализовать методы протокола в основном файле реализации, потому что компилятор будет генерировать тот же класс предупреждений, который не реализует протокол ivAuthoriaztionProtocol. но я хочу реализовать методы протокола в файле категории. и никаких предупреждений=) - person peetonn; 15.07.2011

Объявление метода протокола необязательным решит проблему.

person sanjana    schedule 09.12.2014