79

Objective-C プログラムで列挙型の可視性に問題があります。2 つのヘッダー ファイルがあり、1 つはtypedef enum. 別のファイルでtypedef'd タイプを使用する必要があります。

ストレート C では、単純#includeに他のヘッダー ファイルを使用しますが、Objective-C では、必要に応じて前方宣言を#import使用する代わりに、ヘッダー ファイル間で使用しないことをお勧めします。@classただし、列挙型を前方宣言する方法がわかりません。

.m安全に削除できる対応する実装ファイルを除いて、実際の列挙値は必要ありません#importtypedef enumでは、ヘッダーで認識されるようにするにはどうすればよいですか?

4

6 に答える 6

73

object-c で列挙型 (NS_ENUM/NS_OPTION) を宣言する最新の方法 (Swift 3; 2017 年 5 月) は、次を使用することです。

// Forward declaration for XYZCharacterType in other header say XYZCharacter.h
typedef NS_ENUM(NSUInteger, XYZCharacterType);


// Enum declaration header: "XYZEnumType.h"
#ifndef XYZCharacterType_h
#define XYZCharacterType_h

typedef NS_ENUM(NSUInteger, XYZEnumType) {
    XYZCharacterTypeNotSet,
    XYZCharacterTypeAgent,
    XYZCharacterTypeKiller,
};

#endif /* XYZCharacterType_h */`
于 2017-02-02T17:51:24.673 に答える
9

どうぞご利用#importください。可能であれば使用することをお勧めする唯一の理由@classは、コードのコンパイルがわずかに速くなるからです。#importただし、ある.h ファイルを別の .h ファイルから ingしても問題はありません。実際、別のクラスを拡張するときにこれを行う必要があります。

于 2009-06-03T18:56:47.180 に答える
4

コンパイラ拡張機能を使用しても問題ない場合は、Clang で次の順序を使用できます。

enum Enum;
typedef enum Enum Enum2;

void f(Enum2); // ok. it sees this type's true name.

enum Enum {
    E_1
};

// ok. now its declaration is visible and we can use it.

void f(Enum2 e) {

}

注:-Wpedantic警告がトリガーされます。


C++11 を使用している場合は、前方宣言しても安全な列挙型を使用する必要がありますenum class Enum:uint8_t;(たとえば、コンパイラの拡張機能ではありません)。

于 2013-08-08T01:33:38.137 に答える
2

Objective C の .h ファイルで enum を前方宣言するために機能したのは、 ProjectName-Swift.h ファイルを見て、それが何を入れているかを確認することでした。たまたま次のようになりました。

enum SwiftEnumName : NSInteger;

関数パラメーターの型が SwiftEnumName だったので、この前方宣言が必要でした。そして、 ProjectName-Swift.h インポートを Objective C .h ファイルに入れることはできません。

次に、Objective C .m ファイルに #import "ProjectName-Swift.h" を含め、SwiftEnum を通常どおり使用しました。

これは Swift 4.1.2 を使用していました。

于 2018-07-17T19:34:13.330 に答える
-1

#importとにかくそれらを作成するか、 typedef. ヘッダーにヘッダー ファイルをインポートしないとコンパイルが速くなりますが、それ以外は何も変わりません。

C++ が列挙型の前方宣言をサポートしないのはなぜですか?

于 2009-06-03T18:58:06.723 に答える