3

我是 Objective-C 的新手,并试图找出枚举。有没有办法将枚举范围限定为一个类,以便另一个类可以使用这些值?像这样的东西:

@interface ClassA {
    typedef enum {
        ACCEPTED,
        REJECTED
    } ClassAStatus;
}
@end

@interface ClassB {
    typedef enum {
        ACCEPTED,
        REJECTED
    } ClassBStatus;
}
@end

虽然这不起作用,但显然。还是有更好的方法来做枚举?

编辑:我想我的措辞不清楚,但我不是在问如何声明枚举。我知道将它们放在文件的顶部是可行的。我在问是否有办法确定它们的范围,因此这些值对整个文件来说不是全局的。

4

3 回答 3

6

您必须为您的公共枚举添加前缀。只需将枚举定义放在类的标题中。

// ClassA.h
typedef enum {
    ClassAStatusAccepted,
    ClassAStatusRejected
} ClassAStatus;

@interface ClassA {
    ClassAStatus status;
}
@end


// ClassB.h
typedef enum {
    ClassBStatusAccepted,
    ClassBStatusRejected
} ClassBStatus;

@interface ClassB {
    ClassBStatus status;
}
@end

这就是苹果的做法。

或者您可以使用新样式:

// UIView.h
typedef NS_ENUM(NSInteger, UIViewAnimationCurve) {
    UIViewAnimationCurveEaseInOut,         // slow at beginning and end
    UIViewAnimationCurveEaseIn,            // slow at beginning
    UIViewAnimationCurveEaseOut,           // slow at end
    UIViewAnimationCurveLinear
};
于 2012-11-20T19:27:54.007 回答
3

只需将enum右侧放在 .h 的顶部,就像 Apple 在 UITableView.h 中所做的那样,例如:

//
//  UITableView.h
//  UIKit
//
//  Copyright (c) 2005-2012, Apple Inc. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <CoreGraphics/CoreGraphics.h>
#import <UIKit/UIScrollView.h>
#import <UIKit/UISwipeGestureRecognizer.h>
#import <UIKit/UITableViewCell.h>
#import <UIKit/UIKitDefines.h>

typedef NS_ENUM(NSInteger, UITableViewStyle) {
    UITableViewStylePlain,                  // regular table view
    UITableViewStyleGrouped                 // preferences style table view
};

typedef NS_ENUM(NSInteger, UITableViewScrollPosition) {
    UITableViewScrollPositionNone,
    UITableViewScrollPositionTop,    
    UITableViewScrollPositionMiddle,   
    UITableViewScrollPositionBottom
};                // scroll so row of interest is completely visible at top/center/bottom of view

typedef NS_ENUM(NSInteger, UITableViewRowAnimation) {
    UITableViewRowAnimationFade,
    UITableViewRowAnimationRight,           // slide in from right (or out to right)
    UITableViewRowAnimationLeft,
    UITableViewRowAnimationTop,
    UITableViewRowAnimationBottom,
    UITableViewRowAnimationNone,            // available in iOS 3.0
    UITableViewRowAnimationMiddle,          // available in iOS 3.2.  attempts to keep cell centered in the space it will/did occupy
    UITableViewRowAnimationAutomatic = 100  // available in iOS 5.0.  chooses an appropriate animation style for you
};

您可能认识其中的一些名称,但您可能不知道它们实际上是enumApple 头文件中公共的一部分。

于 2012-11-20T19:29:55.353 回答
2

只是想添加到我通常这样写的@DrummerB 的答案。camelCase 中的命名空间,然后是大写的常量。

typedef enum {
    ClassAStatus_ACCEPTED,
    ClassAStatus_REJECTED
} ClassAStatus;
于 2012-11-20T22:24:43.423 回答