1

我想将自定义计算方法添加到托管对象(根据该对象的其他属性计算某个日期)。

我不确定将其编码为瞬态属性或将类别中的属性添加到此托管对象是否更好。

你怎么看?

这是我当前的代码(类别):

。H:

@interface IBFinPeriod (DateCalculations)
@property (readonly) NSDate* periodBeginDate;
@end

米:

#import "IBFinPeriod+DateCalculations.h"

@implementation IBFinPeriod (DateCalculations)

- (NSDate*)periodBeginDate
{
    NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
    if ([self.incPeriodTypeCode isEqualToString:@"M"]) {
        offsetComponents.month = - [self.incPeriodLength intValue];
    } else if ([self.incPeriodTypeCode isEqualToString:@"W"]) {
        offsetComponents.week = - [self.incPeriodLength intValue];
    }
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDate *beginDate = [calendar dateByAddingComponents:offsetComponents toDate:self.EndDate options:0];
    return beginDate;
}

@end
4

2 回答 2

2

您的解决方案似乎很好。如果您使用瞬态属性,则仍然需要代码来计算其值,因此无论如何您都需要一个类别。

我猜如果你经常访问它的值,那么拥有一个瞬态属性会更有意义,在这种情况下你会想要缓存它的值。如果您只打算访问该值几次,则没有必要这样做。

于 2012-07-05T20:01:59.620 回答
1

为类别提供的只读属性很简单——从长远来看。并且不会弄脏那个对象模型。

但是瞬态属性方法对用户来说很有吸引力,因为派生属性是自动更新的。它有点像这样......

@implementation IBFinPeriod (IBFinPeriod_Observations)


- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

    if ([@"incPeriodTypeCode" isEqualToString: keyPath]  ) {
        [self updatePeriodBeginDate];
    }
    else {
        [super observeValueForKeyPath: keyPath ofObject:object change:change context:context];
    }
}


- (void)updatePeriodBeginDate
{
    NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
    if ([self.incPeriodTypeCode isEqualToString:@"M"]) {
        offsetComponents.month = - [self.incPeriodLength intValue];
    } else if ([self.incPeriodTypeCode isEqualToString:@"W"]) {
        offsetComponents.week = - [self.incPeriodLength intValue];
    }
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDate *beginDate = [calendar dateByAddingComponents:offsetComponents toDate:self.EndDate options:0];

    // NOW SET THE TRANSIENT PROPERTY HERE
    [self setPeriodBeginDate: beginDate];
//        return beginDate; // NOt returning anymore
}


@end
于 2013-06-20T00:14:47.097 回答