在Objective-C中前向声明枚举。

16 浏览
0 Comments

在Objective-C中前向声明枚举。

我在Objective-C程序中遇到了枚举可见性的问题。我有两个头文件,其中一个定义了一个typedef enum,而另一个文件需要使用typedef的类型。

在C语言中,我可以简单地使用#include包含另一个头文件,但是在Objective-C中,推荐不要在头文件之间使用#import,而是根据需要使用前向@class声明。但我想不出如何预先声明枚举类型。

我只需要在相应的.m实现文件中使用实际的枚举值,我可以安全地使用#import导入。那么如何让typedef enum在头文件中被识别出来呢?

admin 更改状态以发布 2023年5月22日
0
0 Comments

回答您的问题是要么直接导入typedef头文件,要么使用一种通用类型,如NSInteger,而不是枚举类型。

然而,不导入头文件的原因不仅仅是编译速度。

不导入头文件还可以减少意外访问多余类的可能性。

例如,假设您有一个TrackFileChanges类,用于跟踪特定文件的文件系统更改,以及一个CachedFile类,用于存储文件的缓存数据。后者可能会使用TrackFileChanges*类型的私有ivar,但对于CachedFile的使用者来说,这只是一个实现细节(理想情况下,ivar将使用新运行时自动生成私有属性,但如果使用旧运行时,则无法实现)。

因此,导入"CachedFile.h"的客户端可能不需要也不希望访问TrackFileChanges.h。如果需要访问,应该通过自己导入明确表明。通过在CachedFile.h中使用@class TrackFileChanges而不是#import "TrackFileChanges.h",可以提高封装性。

但是,所有这些都说过了,如果第二个头文件想向所有客户端公开第一个头文件,那么从第二个头文件导入头文件并没有什么错。例如,声明类的头文件需要直接在子类头文件中导入,声明协议的头文件也可能需要直接导入(尽管您可以使用@protocol ABC;避免这种情况)。

0
0 Comments

最新的在Objective-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 */`

0