我可以扩展一个 Objective-C Foundation 类以便它只影响我的实例吗?

Bru*_*sky 2 objective-c nsdate

我想创建一个返回NSDate. NSDate我的班级的用户可以使用 like应该是“正常的” NSDate *meetingDate = [meeting getDate];。但是当用户这样做时meetingDate.description,这是一个正常的属性/方法NSDate,我希望我的方法被调用以获取自定义格式。如果他们自己创建一个NSDate,我不希望.description改变的行为。

如何才能做到这一点?

Dar*_*ust 5

尽管NSDate是一个类簇,正如其他人指出的那样,但Apple 实际上记录了当您想要创建自己的子类时需要做什么(请参阅子类注释)。这是一个覆盖描述方法的工作版本:

#import <Foundation/Foundation.h>


@interface MyDate : NSDate
@end


@implementation MyDate
{
    NSDate * _internalDate;
}

+ (instancetype)dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)ti
{
    return [[self alloc] initWithTimeIntervalSinceReferenceDate:ti];
}

- (instancetype)initWithTimeIntervalSinceReferenceDate:(NSTimeInterval)ti
{
    self = [super init];
    if (!self) return nil;

    _internalDate = [NSDate dateWithTimeIntervalSinceReferenceDate:ti];

    return self;
}

- (NSTimeInterval)timeIntervalSinceReferenceDate
{
    return _internalDate.timeIntervalSinceReferenceDate;
}

- (NSString *)descriptionWithLocale:(id)locale
{
    return [NSString stringWithFormat:@"%f", self.timeIntervalSince1970];
}

- (NSString *)description
{
    return [NSString stringWithFormat:@"%f", self.timeIntervalSince1970];
}

@end
Run Code Online (Sandbox Code Playgroud)

看来这就是你需要做的。尽管 Apple 写道我们必须实现这些NSCopying方法,copyMyDate按原样似乎确实可以正常工作。没有尝试过NSCoding

请注意,您需要覆盖两者descriptiondescriptionWithLocale:因为%@格式说明符被记录为如下工作:

Objective-C 对象,descriptionWithLocale:如果可用,则打印为返回的字符串,description否则打印。

......并且有一个-[NSDate descriptionWithLocale:],它是首选。

测试:

NSDate *test = [MyDate dateWithTimeIntervalSince1970:1000];
NSDate *test2 = [test copy];
NSLog(@"%@", test2); // Prints: 1000.000000
Run Code Online (Sandbox Code Playgroud)