迭代Objective-C中的属性

迭代Objective-C中的属性,objective-c,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;

我发现一些代码如下所示:

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

我最初的伪代码相当混乱。很抱歉


简单地说,我如何重新构造上面的代码,使我不会不断重复自己?执行的数学运算总是相同的。

我不知道;我不理解第二个代码,如果要打印字符串,这就是它的工作原理:

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) {
    NSLog(@"%@",obj);
}

这主要是一个架构问题。为什么“foo1”、“foo2”和“foo3”不在对象中分组?它们是整数,为什么不使用具有三个整数属性的对象呢?然后在该对象上定义一个方法
updateText
,并调用:

NSArray * properties = [[NSArray alloc] initWithObjects:
                                              obj.foo,
                                              obj.bar,
                                              obj.spam, 
                                              nil];
for (MyObject* object in properties) {
     [object updateText];
} 
当然,您也可以访问Obj-C运行时。最简单的解决方案是使用
nsselector或fromstring
,例如:

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

然后使用
performSelector
,同时使用
NSInvocation
来获取基本类型。

这主要是架构问题。为什么“foo1”、“foo2”和“foo3”不在对象中分组?它们是整数,为什么不使用具有三个整数属性的对象呢?然后在该对象上定义一个方法
updateText
,并调用:

NSArray * properties = [[NSArray alloc] initWithObjects:
                                              obj.foo,
                                              obj.bar,
                                              obj.spam, 
                                              nil];
for (MyObject* object in properties) {
     [object updateText];
} 
当然,您也可以访问Obj-C运行时。最简单的解决方案是使用
nsselector或fromstring
,例如:

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)
{
    SEL selector = NSSelectorFromString(obj);
    if (selector && [statisticsView respondsToSelector:selector])
        NSLog(@"%@",[statisticsView performSelector:selector]);
}

请注意,如果您的属性未返回NSObject,NSLog可能会中断。请谨慎使用此代码:

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

啊,对不起,有点混乱。如果对象是
obj
,我希望迭代它的属性,有效地执行
NSLog(@“%@”,obj.foo),然后是
NSLog(@“%@”,对象栏)等等。啊,对不起,有点混乱。如果对象是
obj
,我希望迭代它的属性,有效地执行
NSLog(@“%@”,obj.foo),然后是
NSLog(@“%@”,对象栏)等等。我想我现在只是把自己和别人弄糊涂了。我已经用我正在使用的实际代码而不是伪代码更新了我的问题。我的答案仍然有效,将所有
idag…
igar…
属性抽象到一个对象中,并在其上创建一个方法。将属性命名为
idag1
idag2
idag3
显然是错误的。应该只有一个名为
idag
的属性,它的属性可以访问浮动
1
2
3
——当然,它们的名称更好,只是数字而已。对不起,我尝试了很多方法,但都无法使用。我使用的是ARC,它阻止隐式类型转换。这感觉好像比需要的复杂得多。为什么迭代某些属性如此困难?为什么我不能切换变量的属性名?这就是我现在想要做的:这很难,因为这是你不应该做的事情!请再读一遍我答案的第一部分。最简单的解决方案是重新设计您的体系结构-您使用的是面向对象的语言,那么为什么不创建对象呢?以数字结尾的属性总是很糟糕,因为它超出了项目的范围。我同意你的看法。写得很差。我的选择是尝试消除一些重复的代码,或者从头开始有效地编写程序。后者根本不可行。我不明白为什么在其他语言中使用变量来代替属性如此困难。我想我现在只是把自己和其他人弄糊涂了。我已经用我正在使用的实际代码而不是伪代码更新了我的问题。我的答案仍然有效,将所有
idag…
igar…
属性抽象到一个对象中,并在其上创建一个方法。将属性命名为
idag1
idag2
idag3
显然是错误的。应该只有一个名为
idag
的属性,它的属性可以访问浮动
1
2
3
——当然,它们的名称更好,只是数字而已。对不起,我尝试了很多方法,但都无法使用。我使用的是ARC,它阻止隐式类型转换。这感觉好像比需要的复杂得多。为什么迭代某些属性如此困难?为什么我不能切换变量的属性名?这就是我现在想要做的:这很难,因为这是你不应该做的事情!请再读一遍我答案的第一部分。最简单的解决方案是重新设计您的体系结构-您使用的是面向对象的语言,那么为什么不创建对象呢?以数字结尾的属性总是很糟糕,因为它超出了项目的范围。我同意你的看法。写得很差。我的选择是尝试消除一些重复的代码,或者从头开始有效地编写程序。后者根本不可行。我不明白为什么像其他语言一样使用变量来代替属性如此困难。无法让它工作。我认为我最初的伪代码令人困惑。很抱歉。我已更新我的问题。无法使其生效。我认为我最初的伪代码令人困惑。很抱歉。我已经更新了我的问题。