Предоставляет ли Какао встроенный метод для преобразования ключа в средство доступа к свойству set? - PullRequest
2 голосов
/ 18 июля 2010

Предоставляет ли Какао встроенный метод для преобразования ключевой строки в правильно отформатированный метод доступа к свойствам набора?т.е. "lineSpacing" -> setLineSpacing:

Например:

NSString * key = @"lineSpacing";
SEL selector = [key magicallyConvertIntoSetPropertyAccessor];

или даже:

NSString * key = @"lineSpacing";
SEL selector = NSSelectorFromString([key toSetPropertyAccessor]);

Фон:

I 'Я работаю над методом, который будет устанавливать ряд свойств по имени, используя значения свойств, хранящиеся в словаре.Я не могу использовать setObject:forKey, потому что я также использую этот метод для свойств, которые имеют встроенные типы, такие как NSInteger и CGFloat.Вот пример метода, который я использую для CGFloat, чтобы проиллюстрировать:

- (void)setFloatProperty:(NSString *)key value:(CGFloat)value target:(id)object
{
    NSString * setPropertyString = [NSString stringWithFormat:@"set%@",
                                    [key capitalizedString]];
    SEL selector = NSSelectorFromString(setPropertyString);

    NSMethodSignature * signature = ...
    NSInvocation * invocation = ...

    CGFloat arg = value;
    void * argument = &arg;

    [invocation setArgument:argument atIndex:2];
    [invocation invoke];
}

Этот метод работает для свойств из одного слова, таких как «цвет» или «ширина», но не работает со свойствами из нескольких слов, например «lineSpacing "или" senseOfLifeTheUniverseAndEverything ", поскольку метод capitalize использует заглавные буквы первой буквы, а все последующие буквы - строчными.Вызов вышеуказанного метода с использованием «lineSpacing» в качестве ключа приводит к сбою, поскольку правильный установщик свойства будет setLineSpacing:, а не setLinespacing:

Ответы [ 2 ]

5 голосов
/ 18 июля 2010

Вы ищете setValue:forKey:, который не только находит правильный селектор, но и отправляет вам сообщение. Это часть протокола кодирования значения ключа ; обратите внимание, что по этой причине геттеры типа myProperty и сеттеры типа setMyProperty: называются «Key-Value-Coding-совместимые»

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

См. Также метод setValuesForKeysWithDictionary: , также являющийся частью протокола KVC.

1 голос
/ 18 июля 2010

Apple не сделала публичную функцию для этого, но общий алгоритм довольно прост:

SEL SetterSelectorForKey(NSString *key) {
    SEL result = 0;

    NSString *strFirstCharacter = [[key substringToIndex: 1] uppercaseString];
    NSString *strRemainder = [key substringFromIndex: 1];

    result = NSSelectorFromString([NSString stringWithFormat: @"set%@%@:", strFirstCharacter, strRemainder]);

    return result;
}

Однако, прежде чем использовать это, имейте в виду, что могут быть и другие способы достижения вашей цели. Изучите существующие API-интерфейсы, которые вы используете, прежде чем уйти, и сделайте это (что, я мог бы добавить, будет не работать правильно, если для метода доступа @property установлено другое значение. Я не знать о любой функции во время выполнения Objective C, которая позволит вам получить установщик @property.)

...