可以在原始值上使用集合运算符吗?
我有一个具有原始属性duration
的对象。
@property (nonatomic) NSTimeInterval duration;
我有这些对象的NSArray
,我想对数组使用收集操作来获得持续时间的sum。问题是@"@sum.duration"
代替了NSNumber
。
我必须以老式的方式执行此操作,还是有使用原语的方法?
来自"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。
您可以随时添加其他属性:
@property (nonatomic) NSNumber *durationNumber;
并同时实现getter和setter:
- (NSNumber *)durationNumber {
return [NSNumber numberWithDouble:self.duration];
}
- (void)setDurationNumber:(NSNumber *)durationNumber {
self.duration = durationNumber.doubleValue;
}
同时实现setter和getter会抑制后备变量的自动合成。