3

私はObjective-Cが初めてで、列挙型を理解しようとしています。値を別のクラスで使用できるように、列挙型をクラスにスコープする方法はありますか? このようなもの:

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

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

それはうまくいきませんが、明らかに。または、列挙型を完全に実行するより良い方法はありますか?

編集:私の言い回しは明確ではなかったと思いますが、列挙型を宣言する方法を尋ねているわけではありません。それらをファイルの先頭に配置すると機能することを認識しています。値がファイル全体にグローバルにならないようにスコープを設定する方法があるかどうかを尋ねています。

4

3 に答える 3

6

public enum の前にプレフィックスを付ける必要があります。enum 定義をクラスのヘッダーに入れるだけです。

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

@interface ClassA {
    ClassAStatus status;
}
@end


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

@interface ClassB {
    ClassBStatus status;
}
@end

これがAppleのやり方です。

または、新しいスタイルを使用できます。

// 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

Apple が UITableView.h で行うように、.h の先頭に右を配置するだけenumです。たとえば、次のようになります。

//
//  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の回答に、私が通常このように書いていることを追加したいだけです。キャメルケースの名前空間と、大文字の定数。

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