Как я могу передать свойство класса в качестве параметра метода в target-c - PullRequest
2 голосов
/ 15 мая 2011

Как я могу передать свойство класса в качестве параметра метода в target-c?

В качестве примера предположим, что у меня есть:

  • управляемый объект CoreDataкласс MyData с динамическими свойствами PropA, PropB, PropC одного типа
  • У меня есть метод utils, который будет выполнять вычисления и обновлять одно из этих свойств, которое принимает в качестве входных данных экземпляр MyData
  • Как я могу устроить так, чтобы метод utils мог указывать, какое свойство использовать в вычислениях и обновлении?(например, PropB)

Итак, нужно:

  1. Способ передачи указания свойства методу (например, отправить как String?)
  2. Способ в методе взять это (из 1 выше) и использовать его для того, чтобы (a) получить доступ к значению этого свойства в экземпляре MyData, который есть у метода, PLUS (b) тоже обновить свойство.

Ответы [ 3 ]

4 голосов
/ 15 мая 2011

Свойства будут иметь метод установки и метод получения. В вашем случае, я предполагаю, что есть setPropA, setPropB, setPropC для сеттеров и PropA, PropB, PropC для геттеров.

Затем я передаю строку «PropA» в утилиту, указывая, что я хочу получить доступ к свойству с именем PropA. Утилита может получить значение по

id val = [aObj performSelector:NSSelectorFromString(@"PropA")];

И установите свойство по

[aObj performSelector:NSSelectorFromString(@"SetPropA") withObject:newValue];

Или, Вы можете передать установщик и получатель в качестве параметра с помощью NSStringFromSelector(), превратить селектор в строку NSString. Например, я передаю сеттер и геттер по NSDictionary.

NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:
                          NSStringFromSelector(@selector(setPropA:)), kSetterKey,
                          NSStringFromSelector(@selector(PropA)), kGetterKey, nil];

// inside myUtil
NSString *setter = [userInfo objectForKey:kSetterKey];
[aObj performSelector:NSSelectorFromString(setter) withObject:newValue];
NSString *getter = [userInfo objectForKey:kGetterKey];
id val = [aObj performSelector:NSSelectorFromString(getter)];

Надеюсь, это поможет.

2 голосов
/ 15 мая 2011

Да, вы можете передать имя свойства в виде строки.

Затем вы можете получить доступ к указанному свойству через кодирование значения ключа: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueCoding/Articles/KeyValueCoding.html

Пример:

- (void) myUtilMethod: (MyData *) myData
     forPropertyNamed: (NSString *) propName /* which property to operate on (1) */
{
   id oldValue = [ myData valueForKey: propName]; // get value (2a)

   id newValue = ...; // your calculation here

   [myData setValue: newValue forKey: propName]; // set value (2b)
}
0 голосов
/ 15 мая 2011

Я не буду связывать 2 класса напрямую. Вам следует настроить дизайн шаблона, который позволит вам свободно объединять их, создавая класс, который будет взаимодействовать между этими двумя.

...