遍历 Objective-C 中的属性



我找到了一些看起来像这样的代码:

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);
}

--注意--

我最初的伪代码相当混乱。对此感到抱歉。

简而言之,我

如何重组上面的代码,这样我就不会不断重复自己?执行的数学运算始终相同。

这主要是一个架构问题。为什么"foo1"、"foo2"和"foo3"没有分组在一个对象中?它们是整数,为什么不使用具有三个整数属性的对象xyz?然后在此类对象上定义一个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 ,也带有NSInvocation来获取基元类型。

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

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

小心的话,这段代码应该可以工作:

    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 可能会中断

最新更新