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