setLineSpacing: 例如: NSString * key = @"lineSpac-6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:26:18 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com