0

センチメートル、キロメートル、秒、時間など、測定した値の単位を示すメンバー変数があります。

これらは列挙型です。対応する文字列を表示すると、これらの列挙型に対応する文字列を返すメソッドを作成しました。

Java とは異なり、列挙型には他のプロパティを関連付けることができません。

したがって、正しい文字列を返すには、if-else-if チェーンまたは switch ケースを明示的に実行する必要があります。

私はObjective Cを初めて使用します。そのようなシナリオで従うべき良い習慣はありますか?

4

3 に答える 3

1

私の知る限り、Objective-C の列挙型は昔ながらの C の列挙型に過ぎないので、整数値を使用できますか?

于 2012-04-04T13:07:15.520 に答える
0

列挙値が0から始まり、増加した場合、ある種の配列アクセスを使用できると思います:

const char *distanceUnitToString2(enum DistanceUnit unit)
{
    const char *values[] = {
            "cm",
            "m",
            "km"
    };

    // do some sanity checking here
    // ...

    return values[unit];
}

しかし、これは私には少し不安定に感じます。負の値がある場合、または のようなビットマスク スタイルの列挙値を使用している場合はどうなります1 << 8か? 非常に大きな配列を使用することになります。

スイッチを使用して、マクロで少し改善することもできます。このようなもの:

const char *distanceUnitToString(enum DistanceUnit unit)
{
#define CASE(UNIT, STRING) case (UNIT): return (STRING)
    switch (unit) {
            CASE(kCentimeters, "cm");
            CASE(kMeters, "m");
            CASE(kKiloMeters, "km");

        default:
            // should not get here
            assert(0);
            break;
    }
#undef CASE
}

しかし、マクロを使用しない場合と比較して、実際にはそれほど節約できません。

于 2012-04-04T13:25:07.867 に答える
0

Martin James のコメントは正解です。そして、次のような列挙型の定義を使用します。

enum units { cm = 0, m, km };

そうすれば、列挙型が正しいインデックス値に変換されることを確認できます。

于 2012-04-04T13:28:39.130 に答える