0

タイトルが少しわかりにくいかもしれないので、シナリオで説明します

2つのint値を比較し、論理比較に基づいてブール値を返したいとします。

if (int1 > int2) return true;
if (int3 < int4) return true;
if (int5 == int6) return true;
if (int7 >= int8) return true;
if (int9 <= int10) return true;

しかし、これを手動で書く代わりに、私は次のようなことをしたいと思います

- (bool)compareVal1: (int)val1 withVal2: (int)val2 usingLogical: (NSString*)logic
{
     if (val1 "logic" val2) return true;
}

必要な5つの論理比較を表すために使用できる一般的な関数が必要です。これが達成可能かどうかはわかりませんが、他に解決策がある場合は、アドバイスしてください:)

4

2 に答える 2

3

まず、NSString の代わりに列挙型を使用して、使用する論理演算子を決定します。だから、次のようなことを試してください:

typedef enum {

    GREATER_THAN,
    LESS_THAN,
    LESS_THAN_OR_EQUAL,
    GREATER_THAN_OR_EQUAL,
    EQUALS

} logicalOperator;    

実際の関数は次のようになります。

+ (bool)compareVal1: (int)val1 withVal2: (int)val2 usingLogical: (logicalOperator)op
{
    switch(op) {

        case GREATER_THAN:
            return (val1 > val2);

        case LESS_THAN:
            return (val1 < val2);

        case LESS_THAN_OR_EQUAL:
            return (val1 <= val2);

        case GREATER_THAN_OR_EQUAL:
            return (val1 >= val2);

        case EQUALS:
            return (val1 == val2);
    }
}

また、クラスの特定のインスタンスに実際に影響を与えるのではなく、渡された値を操作するユーティリティ関数であるため、関数を静的/クラス関数にします。この関数の使用例は次のとおりです。

bool isGreater = [MyClass compareVal1: 4 withVal2: 3 usingLogical: GREATER_THAN];
于 2012-09-26T03:31:21.583 に答える
2

文字列を直接解析して式の結果を返すことができない理由がわかりません。例 (2 つの演算子のみを示す):

- (bool)compareVal1: (int)val1 withVal2: (int)val2 usingLogical: (NSString*)operator
{
   if([operator isEqualTo:@">"])
   {
      return (val1 > val2);
   }
   else if ([operator isEqualTo:@"<"]) 
   {
      return (val1 < val2);
   }
   // similar logic statements for other operators
}

しかし、もっと適切なことに、代わりに評価自体を書くことができるのに、なぜこれを行うメソッドが必要なのでしょうか?

于 2012-09-26T03:27:24.327 に答える