Как заставить подкласс соответствовать протоколу в Objective-C? - PullRequest
1 голос
/ 30 апреля 2019

У меня есть протокол, который реализует базовый класс.У меня есть подклассы, для которых я хочу применить протокол.

@class JSData;

@protocol JSDataProtocol <NSObject, NSCopying, NSMutableCopying>
@property (nonatomic, readonly) NSString *dataType;
@property (nonatomic, readwrite) id value;
- (JSData *)value;
- (BOOL)hasMeta;
// ...
@end

Базовый класс -

@interface JSData : NSObject <JSDataProtocol, JSHashable, JSEquatable>
@end

Затем я создаю другие классы, такие как

@interface JSSymbol: JSData
- (NSString *)name;
- (JSData *)value;
@end

Но проблема здесь в том, что JSData соответствует JSDataProtocol, если я пропустил реализацию какого-либо метода в JSSymbol, XCode не показывает никакого предупреждения, и я получаю ошибку времени выполнения.Есть ли способ обеспечить, чтобы JSSymbol реализовывал все методы, определенные в JSDataProtocol?

1 Ответ

3 голосов
/ 30 апреля 2019

JSSymbol происходит от JSData, который уже реализует методы JSDataProtocol.Так что нет , вы не можете получить ошибки во время компиляции, если не реализовали эти методы.

Если вы действительно этого хотите, вы можете либо:

  • переместитьJSDataProtocol объявление от JSData до конкретных классов.
  • полностью избавиться от JSData и заставить JSDataProtocol наследовать от JSHashable & JSEquatable

Если вы избавитесь от JSData, определение вашего протокола можно упростить до:

@protocol JSDataProtocol <NSObject, NSCopying, NSMutableCopying, 
                          JSHashable, JSEquatable>

@property (nonatomic, readonly) NSString *dataType;
@property (nonatomic, readwrite) id<JSDataProtocol> value;
@property (nonatomic, readonly) BOOL hasMeta;

@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...