我正在编写一个 iOS 应用程序,其中我有一个模型类,它将使用我给它的 XMLElement 进行初始化。
我将 TBXML 用于 XML 部分。
模型类的标题如下所示:
@interface CatalogItem : NSManagedObject
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSManagedObject *group;
-(id)initWithXMLElement:(TBXMLElement*)element;
@end
现在,我不想包含定义 TBXMLElement 的 header ,而是转发声明它:
struct TBXMLElement
在类定义之前。但是,我收到“预期类型”错误,告诉我我的声明不起作用。这不是我会怎么做的吗?据我了解,在头文件中包含头文件是不好的做法。编译器不需要知道
TBXMLElement
的内部工作原理。 ,只是它存在或将在编译时存在。
最佳答案
结构的前向声明一直在使用,但仍涉及导入 header 。动机是不允许开发人员直接进入该结构。 IE。看CFString
.它被实现为结构,但您不能直接接触结构内容。相反,有一个完整的 API 用于操作结构内容。这允许在不破坏二进制兼容性的情况下更改 CFString 的实现细节。
在您的 header 中(最好是定义与 TBXMLElement*
关联的任何 API 的 header ):
TBXMLElement.h:
typedef const struct TBLXMLElement *TBXMLElementRef;
extern TBXMLElementRef TBLXMLCreateElement();
... etc ...
然后,在包含 TBLXMLElementAPI 实现的实现文件中:
TBXMElement.c(假设它是一个 C 文件):
typedef struct __TBLXMLElement {
... struct members here ...
} TBLXMLElement;
TBXMLElementRef TBLXMLCreateElement()
{
return (TBXMLElementRef)malloc(sizeof(TBLXMLElement));
}
... etc ....
关于ios - 在 Objective C 中前向声明结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15930276/