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' 没有分组在一个对象中?它们是整数,为什么不使用具有三个整数属性的x对象?然后在此类对象上定义一个方法并调用:yzupdateText

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, 也可以使用 aNSInvocation来获取原始类型。

于 2012-11-19T11:25:19.793 回答
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 回答
0

我不明白你的第二个代码,如果你想打印字符串,这就是它的工作原理:

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