Как следует обращаться с подклассами, соответствующими NSSecureCoding? - PullRequest
0 голосов
/ 22 апреля 2020

Я часто сталкиваюсь с парадигмой, где я делю на подклассы что-то, что соответствует NSSecureCoding, и мне нужно переопределить функции encodeWithCoder: и initWithCoder:. Я всегда делал это, как показано ниже, но он никогда не чувствует себя подходящим для доступа к ключевым строкам суперкласса из подкласса. Есть ли лучший способ сделать это?

@interface Foo : NSObject <NSSecureCoding>
@property int p1;
@end
@interface Bar : Foo <NSSecureCoding>
@property int p2;
@end

@implementation Foo

- (instancetype)initWithParam:(int)param1 {
    if((self = [super init])) {
        _p1 = param1;
    }
    return self;
}

+ (BOOL)supportsSecureCoding { return YES; }

- (void)encodeWithCoder:(NSCoder *)coder {
    [coder encodeInt:[self p1] forKey:@"p1"];
}

- (instancetype)initWithCoder:(NSCoder *)coder {
    return [self initWithParam:[coder decodeIntForKey:@"p1"]];
}

@end

@implementation Bar

- (instancetype)initWithParam:(int)param1 otherParam:(int)param2 {
    if((self = [super initWithParam:param1])) {
        _p2 = param2;
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)coder {
    [super encodeWithCoder:coder];
    [coder encodeInt:[self p2] forKey:@"p2"];
}

- (instancetype)initWithCoder:(NSCoder *)coder {
    return [self initWithParam:[coder decodeIntForKey:@"p1"]
                    otherParam:[coder decodeIntForKey:@"p2"]];
}

@end

Спасибо:)

...