перебирать свойства объекта и изменять текущее свойство в цикле в target-c - PullRequest
0 голосов
/ 15 ноября 2010

Вопрос новичка: можно ли заменить команды, свойства или методы для 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 Я знаю, что естьлучший фактический способ -объект получения свойств объекта, я даже нашел пост с этим Получить список свойств объекта в Objective-C )

в любом случае, как пройти черезсписок и изменить имя свойства?Допустим, я использую точечную нотацию во время выполнения во время цикла ... Если бы я хотел установить 17 (или 100!) Различных свойств моего объекта для всех значений какого-либо другого массива одновременно, например:

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

Я знаю, что target-c будет искать фактическое свойство с именем "theChangingProperty".Но я хочу, чтобы это был массив, который будет выдавать фактическое свойство, которое будет меняться при каждой итерации цикла (имя, заголовок, номер, property4 и т. Д.)

Спасибо, что нашли время ответить на вопрос новичка :)

Ответы [ 3 ]

3 голосов
/ 15 ноября 2010

То, что вы хотите, называется кодирование значения ключа . В частности, строка, которую вы пытаетесь написать, это [myObject setValue:valueOfAnotherArray[t] forKey:[NSString stringWithUTF8String:theChangingProperty[t]]].

2 голосов
/ 15 ноября 2010

Точечная запись разрешается во время компиляции, а не во время выполнения, поэтому вы не можете использовать ее для этой цели.Вы должны будете использовать имя сеттера для этого.то есть setTheChangingProperty: и performSelector: с соответствующим объектом для передачи в качестве значения.

Обратите внимание, что в простом случае это, вероятно, будет работать очень хорошо, однако, кто-то мог пойти и сделать что-токак:

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

Вы в вышеприведенном случае просто не могли бы предположить, что setBlurgle: является правильным установщиком.

1 голос
/ 15 ноября 2010

Вы можете использовать setValue: forKey:, но обратите внимание, что ключи свойств должны быть строками NSStrings, а не C, поэтому объявите ваш массив:

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

Тогда вы напишите:

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

Или вы можете использовать executeSelector: withObject: но тогда ваш массив должен содержать селекторы

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

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