2011-08-31 5 views
8

私はデザインに関連する質問があります。なぜ文字列定数と列挙定数を使用するのですか?

typedef enum { 
    UITableViewScrollPositionNone,   
    UITableViewScrollPositionTop,  
    UITableViewScrollPositionMiddle, 
    UITableViewScrollPositionBottom 
} UITableViewScrollPosition; 

一つは、通知のためである:他の側に、クラスのUITableViewのような構造体を宣言し、

UIKIT_EXTERN NSString *const UIApplicationDidEnterBackgroundNotification 
UIKIT_EXTERN NSString *const UIApplicationWillEnterForegroundNotification 
UIKIT_EXTERN NSString *const UIApplicationDidFinishLaunchingNotification; 
UIKIT_EXTERN NSString *const UIApplicationDidBecomeActiveNotification; 
UIKIT_EXTERN NSString *const UIApplicationWillResignActiveNotification; 
UIKIT_EXTERN NSString *const UIApplicationDidReceiveMemoryWarningNotification; 

と:

は私がのUIApplicationクラスは旗のこの種を持っていることを見てきましたもう1つはオブジェクトのタイプを定義します。私は、これらの2つは、関連するオブジェクトを「タグ付け」し、そのフラグに基づいて実行時に決定を行う設計選択であると信じています。

タグ付けが必要なオブジェクトのファクトリを作成したいとします。 次の画像では、すべてのセクションとウィジェットの列挙型またはIDが必要です。ウィジェットは、どのようにして別のウィジェットと通信したり、呼び出すことができますか? e.j. [[Container sharedInstance] presentWidget:?? forSection:?? withInfo:(id)info];

enter image description here

それらのいずれかを選択するために、より深いまたはより正確な理由はありますか? ご協力いただきありがとうございます。

+0

最初の数字は文字列のコレクションで、2番目の数字は(@ 0から始まる)整数の選択になります。 – KevinDTimm

+0

Kevinが言ったことに加えて、私は文字列の列挙を行うことはできません。列挙型はタグをグループ化するのに最適です。私の会社では、通常、enum値を明示的に設定します。状態を持続するコードの一部は状態を示すためにenum値を使用することがありますが、新しいバージョンのアプリケーションを読み込んで値を削除すると、明示的に指定されていない限り、enumのすべての値に影響します。 – Sam

+0

私の頭に浮かべているのは、文字列では、これらの文字列を受け取るオブジェクトのインターフェイスを知る必要がないということです。列挙型では、関係するすべてのオブジェクトは、受信者インタフェースを知っています...私はそうですか? – chuckSaldana

答えて

8

enum宣言はではありません。構造体の構文は似ていますが、単に一連の名前付き番号を定義するだけです。

これらの定数は、文字列と数値の2種類のデータ型を参照します。

UIApplicationsの名前付き定数は、NSString オブジェクトへのポインタであり、ポインタ値を持ち、ポインタが指す文字列定数(.mファイル内)もあります。ソートのこのようないくつかの文字列定数を宣言するような(彼らはEXTERNであり、定義が他の場所で完了されることを除き):

NSString* const UIApplicationDidEnterBackgroundNotification = @"UIApplicationDidEnterBackgroundNotification"; 

UITableViewScrollPositionで名前付き定数は整数値に与えられた名前です。

const int UITableViewScrollPositionNone = 0; 

1の場合には列挙型(という名前の数字)を使用する理由は、彼らが値の数を定義する文字列定数対すべての可能な値を定義しているということですが、それはユーザーのために可能である:ソートのが好き他のものを定義する。文字列定数を使用すると、異なるライブラリはそれぞれ重複した文字列アドレスの可能性なしに独自のものを定義できますが、異なる整数を定義した場合、異なるライブラリ間で列挙の拡張を定義すると衝突する可能性があります。

+0

FourCharCodes(OSTypeなど)からUTIsへの切り替えにも同様の引数を付けることができます。他の誰かが既にその識別子を使用していても、4つを見つけることはあまり気にせずにデータを '' com.bigco.document "他の誰も主張していないMac OSのローマ字( '' BgCo '?)はもっと難しいです。より多くの文字を許可するように数字の範囲を広げることはできますが、文字列識別子を使用するときはまだ存在しない人為的な上限があります。 –

+0

同じ識別子名を持つ2つの文字列定数を定義するとリンカーエラーが発生しますが、extern識別子を重複させることはできません。同様に、実際の登録ドメインであると仮定して、逆ドメイン名を重複させることはできません。 – progrmr

0

のように、オブジェクトにenumプロパティが必要です。あなたのクラスの定数を宣言した場合ので、object.UITableViewScrollPosition

あなたは、特定のオブジェクトのためのそれらを変更することはできません。

関連する問題