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

Tra*_* M. 7 import objective-c 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
Run Code Online (Sandbox Code Playgroud)

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

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

Bra*_*red 10

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

@protocol MyProtocol;

@interface MyClass {
    id<MyProtocol> var;
}
@end
Run Code Online (Sandbox Code Playgroud)

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

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


Sen*_*ful 5

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

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

  • 不是为了破口而是为了更精确:你可以转发声明一个协议,但是如果你声明一个符合该协议的类(在该头文件中)则不能.如果协议仅用于方法返回或参数类型,则可以声明它(并且使用"@protocol MyProtocol;"而不是"@class MyProtocol;"来执行此操作). (2认同)