协议和警告的类别“类不实现协议”

时间:2011-07-15 11:29:34

标签: objective-c ios objective-c-category

好吧,我有这两个协议:

@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

所以,问题是 - 如何摆脱主要实现文件中的警告?如何告诉编译器符合协议的方法位于类别中? 提前谢谢!

3 个答案:

答案 0 :(得分:1)

你为什么不考虑这样做:

         @interface ivClientAppDelegate : NSObject <UIApplicationDelegate, ivAuthorizationProtocol >

答案 1 :(得分:1)

您可以使用演员来消除警告:

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

除此之外,如果没有获得不同的警告(未实现的方法),你就无法做你想做的事。通常,您将在界面中指定协议:

@interface ivClientAppDelegate : NSObject <UIApplicationDelegate,ivAuthorizationProtocol

但是你需要在主@implementation块中实现这些方法。

请注意,按惯例,类和协议名称应以大写字符开头。

答案 2 :(得分:0)

将协议方法声明为可选方法将解决问题。