cocoa - Cocoa 是否提供了将键转换为 'set' 属性访问器的内置方法?

标签 cocoa nsstring properties accessor

Cocoa 是否提供内置方法将键字符串转换为格式正确的设置属性访问器?即 "lineSpacing"-> setLineSpacing:

例如:

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

甚至:

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

背景:

我正在开发一种方法,该方法将使用存储在字典中的属性值按名称设置许多属性。我无法使用 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];
}

此方法适用于“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/

相关文章:

ios - 带字节的字符串 : length: encoding: is producing the wrong length of string

ios - 从 PDF 读取特殊字符字节到 unichar 或 NSString

java - 将属性值名称存储为字符串常量 - 性能和内存使用情况?

Swift 类自定义类型属性

cocoa - 启用 NSOutlineView 的复制

objective-c - 如何在 Cocoa 中获取当前日期

objective-c - 为什么我应该使用基于 block 的动画而不是开始/结束动画?

objective-c - 有没有像 iPhoto 那样增强图像颜色的 cocoa API?

objective-c - stringByAddingPercentEscapesUsingEncoding 转义的字符是什么?

variables - Jmeter 将变量设置为属性的默认值