关于原始价值的KVC Collection Operators

时间:2013-12-04 18:14:06

标签: ios primitive key-value-coding

可以在原始值上使用集合运算符吗?

我有一个具有原始属性duration的对象。

@property (nonatomic) NSTimeInterval duration;

我有一个NSArray个对象,我想在数组上使用Collection Operation来获取持续时间的总和。问题是@"@sum.duration"需要NSNumber

我是否必须采用老式的方式,或者有没有办法使用原语?

2 个答案:

答案 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。