tba*_*tba 13 compiler-construction import xcode gcc objective-c
我有以下代码:
#import <Foundation/Foundation.h>
#import "ServerRequest.h" // works even though this line is included
#import "ServerResponseRecord.h"
@protocol ServerRequestDelegate<NSObject>
-(void)request:(id)request gotResponseRecord:(ServerResponseRecord*)response;
-(void)request:(id)request gotError:(NSError*)error;
@end
Run Code Online (Sandbox Code Playgroud)
它编译并运行良好.但是,如果我用以下方法替换方法声明:
-(void)request:(ServerRequest*)request gotResponseRecord:(ServerResponseRecord*)response;
-(void)request:(ServerRequest*)request gotError:(NSError*)error;
Run Code Online (Sandbox Code Playgroud)
我在'ServerRequest'之前得到意外的语法错误"error:expected')'.我认为这可能是一个问题的唯一原因是ServerRequestDelegate.h和ServerRequest.h #import彼此.但是,我不明白为什么代码适用于带有(id)请求的#import行.我也不明白为什么这是一个语法错误.
有人能提供一个很好的解释吗?
Qui*_*lor 26
你已经暗示了这个解释:一个#import循环.
我要做的第一件事是删除#include并在@protocol定义上方添加以下行:
@class ServerRequest;
Run Code Online (Sandbox Code Playgroud)
这是一个前向类声明,可以帮助打破导入循环.查看此SO问题以获取更多详细信息.Apple在本指南中也有一个简短的解释.
基本上,#import'文件会导致编译器将该文件的整个文本带入相关文件中,虽然#import比"更聪明" #include,但这并不意味着您可以免受导入错误的影响.该@class声明的方式告诉一类存在不导入标题中的编译器.当您只需要知道类名时使用它是合适的,但不关心它提供的方法.通常,您希望@class在.h文件和#import.m文件中使用,您实际上正在与该类进行交互.
| 归档时间: |
|
| 查看次数: |
8884 次 |
| 最近记录: |