原始值的KVC集合运算符

问题描述 投票:2回答:2

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

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

@property (nonatomic) NSTimeInterval duration;

我有这些对象的NSArray,我想对数组使用收集操作来获得持续时间的sum。问题是@"@sum.duration"代替了NSNumber

我必须以老式的方式执行此操作,还是有使用原语的方法?

ios objective-c primitive key-value-coding
2个回答
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。


0
投票

您可以随时添加其他属性:

@property (nonatomic) NSNumber *durationNumber;

并同时实现getter和setter:

- (NSNumber *)durationNumber {
    return [NSNumber numberWithDouble:self.duration];
}

- (void)setDurationNumber:(NSNumber *)durationNumber {
    self.duration = durationNumber.doubleValue;
}

同时实现setter和getter会抑制后备变量的自动合成。

© www.soinside.com 2019 - 2024. All rights reserved.