在符合协议的类中,在Objective-C协议中定义的重新声明/扩展typedef

Dav*_*ter 6 c iphone typedef protocols objective-c

我有一个Objective-C协议:

typedef enum {
    ViewStateNone
} ViewState;

@protocol ViewStateable

- (void)initViewState:(ViewState)viewState;
- (void)setViewState:(ViewState)viewState;

@end
Run Code Online (Sandbox Code Playgroud)

我在下面的课程中使用此协议:

#import "ViewStateable.h"

typedef enum {
    ViewStateNone,
    ViewStateSummary,
    ViewStateContact,
    ViewStateLocation
} ViewState;

@interface ViewController : UIViewController <ViewStateable> {

}

@end
Run Code Online (Sandbox Code Playgroud)

我不会深入了解我的应用程序的细节,但我在这里做的是typedef在协议中进行枚举,以便协议的方法可以获取该类型的输入值.

我希望在符合该协议的类中重新声明或扩展该typedef,以便每个类都可以拥有自己的视图状态.但是,我遇到了以下两个错误:

  1. Redeclaration of enumerator 'ViewStateNone'
  2. Conflicting types for 'ViewState'

我很惭愧地承认我对C(即typedefs)的了解并不广泛,我在这里尝试做的事情,首先是可能的,其次是明智的吗?

干杯啦.

Wil*_*and 7

这既不可能不明智.这来自typedef和enums 基本上只是定义的事实.(嗯,不是真的,但为了这个目的,他们是.)如果你需要做这样的事情,你可能想要检查你的设计(见下文).


更多信息

typedef type newtype;
Run Code Online (Sandbox Code Playgroud)

是(几乎)相当于

#define newtype type;
Run Code Online (Sandbox Code Playgroud)

enum {
  ViewStateNone
};
Run Code Online (Sandbox Code Playgroud)

基本上是一样的

#define ViewStateNone 1
Run Code Online (Sandbox Code Playgroud)

关于两者之间的差异,有一些更精细的要点,使用枚举和typedef的最引人注目的论点当然是整数常量的编译时间检查.

然而; 一旦typedef enum {} type;看到它,它就不可见,一旦它被看到,它的名字就是为它保留的,而且它就是它.

所有这些都有办法; 但这些是很少走过的路径,而且通常是有充分理由的.它很快变得非常难以管理.

作为一种解决方案,您可能希望创建一个新类,MyViewState它代表一个视图状态和相关信息,它可以很容易地成为一个包装器NSInteger.


结束时:检查您的设计.我担心你可能会做一些过于复杂的事情.