我找到了一些看起来像这样的代码:
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"没有分组在一个对象中?它们是整数,为什么不使用具有三个整数属性的对象x
、y
和z
?然后在此类对象上定义一个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 可能会中断