如何使子类符合Objective-C中的协议?

时间:2019-04-30 13:44:42

标签: objective-c macos protocols

我有一个基类实现的协议。我有要为其强制执行协议的子类。

@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 个答案:

答案 0 :(得分:3)

JSSymbol源自JSData,后者已经实现了JSDataProtocol方法。因此,,您不会因未实现这些方法而遇到编译时错误。

如果您真的想要这个,可以:

  • JSDataProtocol的声明从JSData移到具体的类。
  • 完全摆脱JSData,并使JSDataProtocolJSHashableJSEquatable继承

如果您摆脱了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