1

私はそれに与える XMLElement で自分自身を初期化するモデル クラスを持つ iOS アプリを書いています。

XML 部分に TBXML を使用しています。

モデル クラスのヘッダーは次のようになります。

@interface CatalogItem : NSManagedObject

@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSManagedObject *group;

-(id)initWithXMLElement:(TBXMLElement*)element;

@end

struct TBXMLElementここで、TBXMLElement が定義されているヘッダーを含める代わりに、クラス定義の前に: を付けて前方宣言したいと思います。ただし、宣言が機能していないことを示す「Expected Type」エラーが表示されます。これは私がこれについて得た方法ではありませんか?

私が理解しているように、ヘッダーファイルにヘッダーファイルを含めることは悪い習慣です。コンパイラは の内部動作を知る必要はなくTBXMLElement、コンパイル時にそれが存在するか存在することだけを知っている必要があります。

4

2 に答える 2

4

構造体の前方宣言は常に使用されますが、それでもヘッダーのインポートが必要です。動機は、開発者が構造に直接浸ることを許可しないことです。すなわち見てくださいCFString。構造体として実装されていますが、構造体の内容に直接触れることはできません。代わりに、構造体の内容を操作するための完全な API があります。これにより、バイナリ互換性を損なうことなく CFString の実装の詳細を変更できます。

ヘッダー (理想的には、関連付けられている API を定義するヘッダーTBXMLElement*):

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 ....
于 2013-04-10T15:43:40.013 に答える