8

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

我的视图.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。

4

5 回答 5

11

@protocol如果您只需要以下变量,则可以使用它来转发声明协议:

@protocol MyProtocol;

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

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

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

于 2013-10-21T16:37:24.880 回答
6

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

因此,您必须遵守#import协议。出于这个原因,将协议和类拆分为单独的文件可能是一个好主意。有关更多信息,请参阅此答案

于 2013-10-21T16:31:11.823 回答
4

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

于 2013-10-21T16:26:42.463 回答
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#import

我的视图.h:

#import <UIKit/UIKit.h>
#import "MyCustomClass.h"    // the compile now knows what MyCustomClassDelegate is

@interface MyView : UIView <MyCustomClassDelegate>

@end
于 2013-10-21T16:29:32.920 回答
0

您不能转发声明您遵守的协议。

如果您使用MyViewas a MyCustomClassDelegateonly inMyView的实现,您可以在 .m 文件中使用 Extension MyView,例如:

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

@interface MyView () <MyCustomClassDelegate> {

}

@end

@implementation MyView
    ...
@end
于 2018-05-19T13:05:18.193 回答