我已经读过您应该尝试在头文件中使用@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。
答案 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