Установка свойства динамического примитивного типа в Objective C

StackOverflow https://stackoverflow.com/questions/1032116

Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

int myVar;
...
@propery (nonatomic) int myVar;

Другие советы

" Однако метод 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];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top