Cocoa 是否提供内置方法来将键字符串转换为格式正确的 set 属性访问器?IE"lineSpacing" -> setLineSpacing:
例如:
NSString * key = @"lineSpacing";
SEL selector = [key magicallyConvertIntoSetPropertyAccessor];
甚至:
NSString * key = @"lineSpacing";
SEL selector = NSSelectorFromString([key toSetPropertyAccessor]);
背景:
我正在研究一种方法,该方法将使用存储在字典中的属性值按名称设置许多属性。我不能使用setObject:forKey
,因为我也将此方法用于内置类型的属性,例如NSInteger
and 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”或“meaningOfLifeTheUniverseAndEverything”等多字属性,因为该capitalize
方法将第一个字母大写,同时将所有后续字母设置为小写。使用“lineSpacing”作为键调用上述方法会导致失败,因为正确的属性设置器将是setLineSpacing:
而不是setLinespacing: