1

次のようなコードが見つかりました。

if (statisticsObject.idag3_orig != 0) {
    statisticsView.idag3.text = [NSString stringWithFormat:@"%i",statisticsObject.idag3_orig];
} else {
    float compare1 = statisticsObject.idag2;
    float compare2 = statisticsObject.idag3;
    float result = compare1 + (compare1 * (compare2 / (float) 100.00));
    int final = (int)roundf(result);
    statisticsView.idag3.text = [NSString stringWithFormat:@"%i",final];
}

if (statisticsObject.igar3_orig != 0) {
    statisticsView.igar3.text = [NSString stringWithFormat:@"%i",statisticsObject.igar3_orig];
} else {
    float compare1 = statisticsObject.igar2;
    float compare2 = statisticsObject.igar3;
    float result = compare1 + (compare1 * (compare2 / (float) 100.00));
    int final = (int)roundf(result);
    statisticsView.igar3.text = [NSString stringWithFormat:@"%i",final];
}

これが何度も何度も繰り返されます。明らかに、あまり乾燥しているとは感じず、作業するのは少し面倒です. このロジックを変数プロパティ名でループするにはどうすればよいですか? 私が取ったアプローチは、Objective-C では許可されていないと思います。これが私が試したことです:

NSArray * properties = [[NSArray alloc] initWithObjects:
                                              @"foo",
                                              @"bar",
                                              @"spam", 
                                              nil];
for (id prop in properties) {
    NSLog(@"%@",obj.prop);
}

- ノート -

私の元の疑似コードはかなり混乱していました。申し訳ありません。

簡単に言えば、上記のコードを再構築して、常に同じことを繰り返さないようにするにはどうすればよいでしょうか? 実行される数学演算は常に同じです。

4

3 に答える 3

1

これは主にアーキテクチャの問題です。「foo1」、「foo2」、および「foo3」がオブジェクトにグループ化されないのはなぜですか? それらは整数です。なぜ 3 つの整数プロパティを持つオブジェクトを使用しないのxですyz? 次に、そのようなオブジェクトにメソッドを定義してupdateText呼び出します。

NSArray * properties = [[NSArray alloc] initWithObjects:
                                              obj.foo,
                                              obj.bar,
                                              obj.spam, 
                                              nil];
for (MyObject* object in properties) {
     [object updateText];
} 

もちろん、Obj-C ランタイムにアクセスすることも可能です。最も簡単な解決策は、使用することNSSelectorFromStringです。

SEL sel1 = NSSelectorFromString([NSString stringWithFormat:@"%s%i", @"foo", 1]);

次にperformSelector、 を a と共に使用して、NSInvocationプリミティブ型を取得します。

于 2012-11-19T11:25:19.793 に答える
0

私はあなたの2番目のコードを理解していません.文字列を印刷したい場合、これはうまくいくでしょう:

NSArray * properties = [[NSArray alloc] initWithObjects:
                                          @"foo",
                                          @"bar",
                                          @"spam", 
                                          nil];
for (id obj in properties) {
    NSLog(@"%@",obj);
}
于 2012-11-19T11:19:09.810 に答える
0

いくつかの注意を払って、このコードが機能するはずです。

    NSArray * properties = [[NSArray alloc] initWithObjects:
                        @"foo",
                        @"bar",
                        @"spam",
                        nil];
for (id obj in properties)
{
    SEL selector = NSSelectorFromString(obj);
    if (selector && [statisticsView respondsToSelector:selector])
        NSLog(@"%@",[statisticsView performSelector:selector]);
}

プロパティが NSObject を返さない場合、NSLog が破損する可能性があることに注意してください。

于 2012-11-19T11:26:13.903 に答える