Cocoa是否提供了将密钥转换为"set"属性访问器的内置方法?

e.J*_*mes 2 cocoa properties accessor nsstring

Cocoa是否提供了一种内置方法来将密钥字符串转换为格式正确的set属性访问器?即"lineSpacing" -> setLineSpacing:

例如:

NSString * key = @"lineSpacing";
SEL selector = [key magicallyConvertIntoSetPropertyAccessor];
Run Code Online (Sandbox Code Playgroud)

甚至:

NSString * key = @"lineSpacing";
SEL selector = NSSelectorFromString([key toSetPropertyAccessor]);
Run Code Online (Sandbox Code Playgroud)

背景:

我正在研究一种方法,该方法将使用存储在字典中的属性值按名称设置许多属性.我无法使用,setObject:forKey因为我也将此方法用于内置类型的属性,如NSIntegerCGFloat.以下是我用于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];
}
Run Code Online (Sandbox Code Playgroud)

此方法适用于"color"或"width"等单字属性,但在"lineSpacing"或"meaningOfLifeTheUniverseAndEverything"等多字属性上失败,因为该capitalize方法将所有后续字母设置为小写时将第一个字母大写.使用"lineSpacing"作为键调用上述方法会导致失败,因为正确的属性设置器将是setLineSpacing:和不是setLinespacing:

Pet*_*sey 5

你正在寻找setValue:forKey:,它不仅找到正确的setter选择器,而且为你发送消息.它是键值编码协议的一部分; 请注意,出于这个原因,类似于getter myProperty和类似setMyProperty:的setter 被称为"Key-Value-Coding-compliant".

我正在研究一种方法,该方法将使用存储在字典中的属性值按名称设置许多属性.

另请参阅setValuesForKeysWithDictionary:方法,也是KVC协议的一部分.