Cocoa 是否提供内置方法将键字符串转换为格式正确的设置属性访问器?即 "lineSpacing"-> setLineSpacing:
例如:
NSString * key = @"lineSpacing";
SEL selector = [key magicallyConvertIntoSetPropertyAccessor];
甚至:
NSString * key = @"lineSpacing";
SEL selector = NSSelectorFromString([key toSetPropertyAccessor]);
背景:
我正在开发一种方法,该方法将使用存储在字典中的属性值按名称设置许多属性。我无法使用 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];
}
此方法适用于“color”或“width”等单字属性,但不适用于“lineSpacing”或“meaningOfLifeTheUniverseAndEverything”等多字属性,因为 capitalize
方法将第一个字母大写同时将所有后续字母设置为小写。使用“lineSpacing”作为键调用上述方法会导致失败,因为正确的属性 setter 是 setLineSpacing:
而不是 setLinespacing:
最佳答案
您正在寻找 setValue:forKey:
,它不仅可以找到正确的 setter 选择器,还可以为您发送消息。它是 the Key-Value Coding protocol 的一部分;请注意,像 myProperty
这样的 getter 和像 setMyProperty:
这样的 setter 出于这个原因被称为“键值编码兼容”。
I'm working on a method that will set a number of properties, by name, using property values stored in a dictionary.
另请参阅the setValuesForKeysWithDictionary:
method ,也是 KVC 协议(protocol)的一部分。
关于cocoa - Cocoa 是否提供了将键转换为 'set' 属性访问器的内置方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3274107/