使用@class来访问委托协议声明

时间:2013-10-21 16:25:12

标签: objective-c import header-files forward-declaration objective-c-protocol

我已经读过您应该尝试在头文件中使用@class而不是#import,但是当您的@class包含委托协议时,这不起作用试图使用。

MyView.h

#import <UIKit/UIKit.h>
@class MyCustomClass;  // <-- doesn't work for MyCustomClassDelegate, used below

@interface MyView : UIView <MyCustomClassDelegate>

@end

我认为我忽视了某些事情,有没有办法让@class在这种情况下工作,或#import是我唯一的选择?

编辑:当然,解决这个问题的方法是在.m文件的私有接口部分而不是.h文件中声明#import MyCustomClass和MyCustomClassDelegate。

5 个答案:

答案 0 :(得分:10)

你可以使用@protocol转发声明一个协议,如果你只需要这样的变量:

@protocol MyProtocol;

@interface MyClass {
    id<MyProtocol> var;
}
@end

在您的情况下,声明的类正在尝试符合协议,因此编译器必须知道此时的协议方法,以便推断天气与否符合该类。

在这种情况下,我认为您的选择是将协议拆分为自己的文件和#import该标头,或者在使用它的类声明之上声明该标头中的协议。

答案 1 :(得分:5)

您只能在同一个头文件中转发声明协议,以便在方法返回值或参数类型中使用。在您的情况下,您希望该类符合协议,因此它将无法工作,因为它定义了将添加到类本身的行为(即它将响应的方法)。

因此,您必须#import协议。因此,将协议和类拆分为单独的文件可能是个好主意。有关详细信息,请参阅this answer

答案 2 :(得分:4)

MyCustomClassDelegate是一个协议,而不是一个类。告诉编译器MyCustomClass的存在,不告诉协议是否存在。

答案 3 :(得分:2)

您需要在课前声明您的委托协议:

MyCustomClass.h:

#import <UIKit/UIKit.h>
@class MyCustomClass;

@protocol MyCustomClassDelegate <NSObject>

- (void)myCustomClass:(MyCustomClass *)customClass
              didBlah:(BOOL)blah;

@end

@interface MyCustomClass : NSObject <MyCustomClassDelegate>

@end

你甚至不能使用@protocol来转发声明委托协议;编译器必须看到完整的声明,因此更改@class的{​​{1}}:

MyView.h:

#import

答案 4 :(得分:0)

您无法转发声明符合的协议。

如果您仅在MyView的实施中使用MyCustomClassDelegate作为MyView,则可以在MyView的.m中使用扩展程序文件,例如:

#import "MyView.h"
#import "MyCustomClassDelegate.h"

@interface MyView () <MyCustomClassDelegate> {

}

@end

@implementation MyView
    ...
@end