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,以便每个类都可以拥有自己的视图状态.但是,我遇到了以下两个错误:
Redeclaration of enumerator 'ViewStateNone'Conflicting types for 'ViewState'我很惭愧地承认我对C(即typedefs)的了解并不广泛,我在这里尝试做的事情,首先是可能的,其次是明智的吗?
干杯啦.
这既不可能也不明智.这来自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.
结束时:检查您的设计.我担心你可能会做一些过于复杂的事情.