关于ObjC编程的两个完整的新手问题 - 使用我过去使用的其他语言的想法。如果在ObjC中存在这样的概念会很棒,但到目前为止我能够收集到的所有信息都是关于“for”循环等简单的东西。
在目标C中,在执行一行之前是否有先评估变量的方法?
例如,假设我有5个标签,我想要更改文本。我可以做类似的事情:
Label1.text = array(1)
Label2.text = array(2)
Label3.text = array(3)
Label4.text = array(4)
Label5.text = array(5)
但我真正想做的是:
for (x=0; x<=5; x++) {
Label'x'.text = array(x)
}
这在Objective C中是否可行?如果是这样,任何想法是什么或语法是什么?
与上述相关,有没有办法与对象做类似的事情?
示例:
foo = objectA
'foo'.textcolor = red
foo = objectB
'foo'.textcolor = green
所以...然后有2个具有不同文本颜色的对象 -
objectA为红色,objectB为绿色。 foo只是一个“占位符”或“替身”对象,没有任何属性本身。
这对任何人都有意义吗?
LOL
提前致谢,
-Leevy
答案 0 :(得分:3)
两者都不可能。
您真正应该做的是使用数组来存储标签。还有一个单独的值数组。
我想不出这种情况真的有必要,最后这可能会引入一些很难发现的错误。
在大多数编译的编程语言中,名称仅适用于开发人员。使用编译器后,它们将转换为地址,并且变量的名称将丢失。
答案 1 :(得分:2)
我不推荐这个,但是如果你真的想这样做,并且你的标签是作为属性公开的:
int i;
NSArray *myArray = [NSArray arrayWithObjects:@"Text1", @"Text2", @"Text3", @"Text4", @"Text5", nil];
for (i = 0; i < 5; i++)
{
SEL aSel = NSSelectorFromString([NSString stringWithFormat:@"Label%d", i + 1]);
[[self performSelector:aSel] setText:[myArray objectAtIndex:i]];
}
未经测试。
答案 2 :(得分:-1)
你可以这样做:
LABEL Label1;
LABEL Label2;
LABEL Label3;
LABEL Label4;
LABEL Label5;
LABEL *Labels = &Label1;
for(int i = 0; i < 5; i++)
Labels[i].text = array(i);
但是,如果这种情况有效,则可以保证它不会始终有效,我建议不要使用它。这是否有效取决于编译器如何为标签保留空间(从编译器到编译器以及从编译器设置到编译器设置的变化)。
我能想到的最接近这个问题的是:
由于您要设置两个对象的文本颜色,我假设它们的行为是相关的。如果 objectA 和 objectB 是同一个类的两个对象,则可以执行
TheClass *objectA = [[TheClass alloc] init];
TheClass *objectB = [[TheClass alloc] init];
TheClass *foo = objectA;
[foo setTextColor:RED];
foo = objectB;
[foo setTextColor:BLUE];
如果它们不是同一个类的对象,你可以让它们从同一个超类继承,并做这样的事情:
SubClassA *objectA = [[SubClassA alloc] init];
SubClassB *objectB = [[SubClassB alloc] init];
SuperClass *foo = objectA;
[foo setTextColor:RED];
foo = objectB;
[foo setTextColor:BLUE];
setTextColor的实现在所有3个类中都是不同的。在SuperClass中它将是一个空函数,而在两个SubClass类中它将特定于Class。