2

私はAndroid開発者ですが、iOS開発のトンネルの終わりに光が見え始めています。

ただし、同等のものを見つけることができないと思われるコーディングパターンが1つあります。

フラグとしての静的フィールドの使用。

Android:

public final static int ERROR_EMPTY = 1;
public final static int ERROR_NO_CONNECTION = 2;
public final static int ERROR_WRONG_USER = 4;

...

if (error == MyClass.ERROR_EMPTY) {//do things}

iOSでこれを達成するための適切な方法は何でしょうか?

ありがとう。

4

2 に答える 2

4

Objective-CとCの使用

私はよくプレフィックスを使用します:

typedef enum MyClass_Error {
  // never use MyClass_Error_Undefined
  // or you may favor MyClass_Error_None for a valid error code
  MyClass_Error_Undefined = 0,
  MyClass_Error_Empty = 1,
  MyClass_Error_NoConnection = 2,
  MyClass_Error_WrongUser = 4
  // ...
} MyClass_Error;

これらの値のコレクション。switch次に、型安全性や値のチェックなどの利点が得られます。

非型定数の場合:

enum { MyClass_ConstantName = 4 };

*.mプライベートのときは、これらを自由に非表示にしてください。

enumまた、Cは(Javaとは異なり)定義された値にギャップがある場合があることにも注意してください。

更新: Abizernの回答に示されているように、列挙型を宣言するさらに良い方法があります-最新のツールチェーンを使用している場合。この拡張機能を使用する大きな理由は、バイナリ互換性とエンコーディングのためです(ただし、これらの目的には固定幅タイプを使用します)。


既存のタイプを使用する場合のために、他にもいくつかのバリエーションがあります。

プライベート定数

MyClass.m

static const NSRange MyClass_InputRange = {1,1};

パブリックコンスタント

MyClass.h

extern const NSRange MyClass_InputRange;

MyClass.m

const NSRange MyClass_InputRange = {1,1};

C++の使用

プレフィックスを使用してスコープをシミュレートするのではなく、クラスまたは名前空間のいずれかに、これらの値に新しいスコープを導入することをお勧めします。

よくある間違い

  • for定数の使用#define(前処理時に定義が必須でない場合)
  • 短い識別子、および接頭辞が付いていない識別子の使用
  • staticヘッダーでの値の使用
  • const可能な場合は使用しない
  • それらがソースにある可能性がある場合は、ヘッダーでそれらを宣言します*.m
于 2012-08-08T09:30:44.300 に答える
2

Justinの優れた答えに追加するだけです-列挙型のModernObjective-Cの定義は次のようになります:

typedef enum MyClass_Error : NSUInteger {
  // never use MyClass_Error_Undefined
  // or you may favor MyClass_Error_None for a valid error code
  MyClass_Error_Undefined = 0,
  MyClass_Error_Empty = 1,
  MyClass_Error_NoConnection = 2
  // ...
} MyClass_Error;
于 2012-08-08T09:46:30.290 に答える