可以在原始值上使用集合运算符吗?
我有一个具有原始属性duration
的对象。
@property (nonatomic) NSTimeInterval duration;
我有一个NSArray
个对象,我想在数组上使用Collection Operation来获取持续时间的总和。问题是@"@sum.duration"
需要NSNumber
。
我是否必须采用老式的方式,或者有没有办法使用原语?
答案 0 :(得分:4)
来自"Scalar and Structure Support" 在“键值编码编程指南”中:
键值编码为标量值和数据提供支持 通过自动包装和展开NSNumber和 NSValue实例值。
所以
NSNumber *sum = [array valueForKeyPath:@"@sum.duration"];
正常工作,即使duration
是标量属性。小型自足的例子:
#import <Foundation/Foundation.h>
@interface MyClass : NSObject
@property(nonatomic, assign) NSTimeInterval duration;
@end
@implementation MyClass
@end
int main(int argc, const char * argv[])
{
@autoreleasepool {
MyClass *obj1 = [MyClass new];
obj1.duration = 123.4;
MyClass *obj2 = [MyClass new];
obj2.duration = 456.7;
NSArray *array = @[obj1, obj2];
NSNumber *sum = [array valueForKeyPath:@"@sum.duration"];
NSLog(@"sum = %@", sum);
}
return 0;
}
输出:580.1。
答案 1 :(得分:0)
您可以随时添加其他属性:
@property (nonatomic) NSNumber *durationNumber;
并实现getter和setter:
- (NSNumber *)durationNumber {
return [NSNumber numberWithDouble:self.duration];
}
- (void)setDurationNumber:(NSNumber *)durationNumber {
self.duration = durationNumber.doubleValue;
}
实施setter和getter会禁止自动合成背景ivar。