【发布时间】:2016-01-13 17:55:07
【问题描述】:
为了在我的应用程序中处理从 AFNetworking 库收到的 JSON 数据,我在文件 NSDictionary+JSON.h 中定义了 NSDictionary 上的一个类别:
@interface NSDictionary (JSON)
- (NSString *) name;
- (NSString *) extension;
...
@end
在我对这些方法的实现中,我想声明并使用一个我不想放在头文件中的辅助方法,因为它只是一个实现细节:
- (NSString *) valueForKeyFromDictionaryOrIndexes:(NSString *)key;
我的实现文件 NSDictionary+JSON.m 如下所示:
#import "NSDictionary+JSON.h"
@interface NSDictionary()
// Putting my method declaration here produces a warning.
...
@end
@implementation NSDictionary (JSON)
- (NSString *) valueForKeyFromDictionaryOrIndexes:(NSString *)key {
NSString * value = [self valueForKey:key];
// implementation details omitted
return value;
}
- (NSString *) name {
return [self valueForKeyFromDictionaryOrIndexes:@"Name"];
}
- (NSString *) extension {
return [self valueForKeyFromDictionaryOrIndexes:@"Extension"];
}
...
@end
这很好用,所以从这个意义上说没有真正的问题。但是:我的辅助方法在定义之前从未被声明过。我对此感到有点不舒服。如果我将声明放在实现文件的 @interface ... @end 部分的注释位置(我认为这是声明非公共方法的正确位置),我会收到警告:
类别正在实现一个方法,该方法也将由其主类实现
我尝试通过替换来解决这个问题 @interface NSDictionary() 和 @interface NSDictionary(JSON) 但这当然给了我不同的警告:
接口“NSDictionary”上的类别“JSON”的重复定义
很公平,这确实与我的头文件中的相同,所以这不是一个合适的解决方案。这让我想知道:在类别实现中声明非公共方法的正确方法/位置是什么?
【问题讨论】:
-
您需要为添加到框架类的方法加上前缀。
标签: ios objective-c