有没有办法使用 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
属性,我可以传递带有值的 NSDictionary
(NSNumber
没有问题)来设置每个相关值。
理想情况下,我可以在没有枚举器或自定义设置器的情况下执行此操作 - 这可行吗?
【问题讨论】:
您总是可以使用 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: 有啥区别?