Установка свойства динамического примитивного типа в Objective C - PullRequest
2 голосов
/ 23 июня 2009

Я пытаюсь написать библиотеку, чтобы она была достаточно общей и полезной. Проблема в том, что ему нужно обновить свойства других классов, и свойство, и класс должны быть динамическими.

Теперь я могу сделать это, используя открытые переменные, без проблем, я просто передаю указатель на переменную, которую хочу обновить. Однако было бы также невероятно полезно установить свойства классов, так как они широко используются в цели C.

Теперь опять это не проблема, если свойство является типом объекта и пытается установить свойства примитивного типа.

Мой текущий код выглядит примерно так:

NSInvocation* invoc = [NSInvocation invocationWithMethodSignature:[[myInstance class] instanceMethodSignatureForSelector:mySelector]];
[invoc setTarget:myInstance];
[invoc setSelector:mySelector];
[invoc setArgument:&myObject atIndex:2];
[invoc invoke];

Однако метод setArgument допускает только типы указателей, но свойства могут иметь любой примитивный тип. Есть ли способ динамического назначения свойств примитивного типа?

Ответы [ 2 ]

5 голосов
/ 23 июня 2009

КВО должен сделать преобразование для вас:

[object setValue:[NSNumber numberWithInt:i] forKey:@"myVar"];

преобразует NSNumber в int, если ваш myVar определен как:

int myVar;
...
@propery (nonatomic) int myVar;
1 голос
/ 01 августа 2011

"Однако метод setArgument допускает только типы указателей" Вы что-то упустили. Аргумент setArgument: не является данными, которые вы передаете методу. Это адрес данных ( независимо от типа ), которые вы передаете. Прямо сейчас ваш код выше принимает адрес указателя объекта (это указатель на указатель). Вы можете также легко заставить его принимать адрес целого числа (это не волнует). Другими словами, ваш точный код уже работает независимо от типа:

NSInvocation* invoc = [NSInvocation invocationWithMethodSignature:[myInstance methodSignatureForSelector:mySelector]];
[invoc setTarget:myInstance];
[invoc setSelector:mySelector];
int myInt = 42;
[invoc setArgument:&myInt atIndex:2];
[invoc invoke];
...