迭代对象属性并更改objective-c中循环中的当前属性

时间:2010-11-15 03:58:14

标签: objective-c loops properties substitution

新手问题:可以在运行时替换NSStrings或char的命令,属性或方法吗?

让我说我做这样的事情:

//these are the names of my properties of an NSObject I created
char theChangingProperty[17][18] = {"name", "title", "number", "property4", "property5", "property6", "property7", "property8", "property9", "property10", "property11", "property12", "property13", "property14", "property15", "property16", "property17"};

(PS我知道有一个更好的实际目标 - 获取对象属性的方法,我甚至发现了一个帖子Get an object properties list in Objective-C

无论如何,如何遍历列表并更改属性名称?让我说我在循环期间在运行时使用点表示法...如果我想将我的对象的17(或100!)个不同的属性全部设置为其他一些数组的值,如下所示:

for (int t=1; t<17; t++) {
    myObject.theChangingProperty[t] = valueOfAnotherArray[t];
}

我知道objective-c将寻找一个名为“theChangingProperty”的实际属性。但我希望它是一个数组,它会吐出每次循环迭代时会改变的实际属性(名称,标题,数字,属性等)

感谢您抽出时间回答新手问题:)

3 个答案:

答案 0 :(得分:3)

您想要的是key-value coding。具体来说,您尝试撰写的行是[myObject setValue:valueOfAnotherArray[t] forKey:[NSString stringWithUTF8String:theChangingProperty[t]]]

答案 1 :(得分:2)

点编号在编译时解决,而不是运行时,因此您不能将其用于此目的。你必须使用setter名称。即setTheChangingProperty:performSelector:,并将适当的对象作为值传入。

请注意,在一个简单的情况下,这可能会运作得很好,但是,有人可能已经进入并做了类似的事情:

@property (nonatomic, retain, setter=fooBarBaz:) id blurgle;

在上述情况下,您不能简单地认为setBlurgle:是正确的制定者。

答案 2 :(得分:1)

您可以使用setValue:forKey:但请注意,属性键需要是NSStrings,而不是C字符串,因此声明您的数组:

NSString* theChangingProperty[17] = { @"name", ....

然后你会写:

for (int t = 0; t < 17; t++) 
{
    [myObject setValue: valueOfAnotherArray[t] forKey: theChangingProperty[t]];
}

或者你可以使用performSelector:withObject:但是你的数组需要包含选择器

SEL theChangingProperty[17] = { @selector(setName:), ....

for (int t = 0; t < 17; t++) 
{
    [myObject performSelector: theChangingProperty[t] withObject: valueOfAnotherArray[t]];
}