有没有办法使用 setValue:forKey 来获取 C 类型的变量?

Posted

技术标签:

【中文标题】有没有办法使用 setValue:forKey 来获取 C 类型的变量?【英文标题】:Is there a way to use setValue:forKey which will take C-type variables? 【发布时间】:2013-02-21 12:27:24 【问题描述】:

我在一个对象上设置了一些属性,主要是 GLfloat,我想知道是否有一种方法可以使用 [self setValue:(id)value forKey:(id)key]; 来接受 c 样式变量?

如果有替代品,则不必是setValue:forKey

我的理由是我在一个对象上有很多 floats 属性,我可以传递带有值的 NSDictionaryNSNumber 没有问题)来设置每个相关值。

理想情况下,我可以在没有枚举器或自定义设置器的情况下执行此操作 - 这可行吗?

【问题讨论】:

您总是可以使用 NSValue 对象来“包装”其他实体。不一定方便。但是,当然,NSNumber 适用于浮点数。 【参考方案1】:

同样,setValue:forKey: 确定了所需的数据类型 指定键的适当访问器或实例变量。如果 数据类型不是对象,则从 使用适当的 -Value 方法传递对象。

您可以传递NSNumber,它会自动转换回您的设置器的浮点数。

@interface MyClass ()

@property (nonatomic, assign) CGFloat example;

@end

@implementation MyClass

- (void)testSetter 
    [self setValue:@(5.0f) forKey:@"example"];


@end

【讨论】:

您的答案与其他答案有何不同? 另一个答案没有解释属性仍然是浮点数,或者属性是 NSNumber。 (自动值转换)【参考方案2】:

您可以使用新的 Objective-C 语法自动将任何值装箱到 NSNumber:

GLfloat alpha;
alpha = 2.3f;

[self setValue:@(alpha) forKey:@"theKey"];

这会自动为您将浮点数转换为 NSNumber。

【讨论】:

我刚试过这个,@alpha 给出了一个错误'unexpected '@' in program'

以上是关于有没有办法使用 setValue:forKey 来获取 C 类型的变量?的主要内容,如果未能解决你的问题,请参考以下文章

setValue: forKey: 和 setValue: forKeyPath:

自定义核心数据访问器——setValue:forKey: vs. setPrimitiveValue:forKey:

NSMutableArray 的 setValue:forKey: 和 setObject:forKey: 有啥区别?

具有 NSObject 继承的泛型类,self.setValue(, forKey:) 不起作用

iPhone - setValue:forkey: 未记录

setValue和setObject的区别