目前,我正在使用仍处于开发阶段的API。因此,响应中的键仍在变化。我已成功地将API中的JSON数据检索并解析为NSDictionary,然后使用此NSDictionary将值映射到自定义对象。我正在使用的方法是以下
-(id)initWithDictionary:(NSDictionary*)dictionary
{
if(self = [super init]){
_ID = [dictionary valueForKey:kKEY_ID];
_name = [dictionary valueForKey:kKEY_NAME];
_nestedObject = [[NestedObject alloc]initWithDictionary:[dictionary valueForKey:kKEY_NESTED_OBJECT]];
//etc...
}
return self
}
每个嵌套对象也包含相同的解析结构。
除了API更改时,此方法正常。当某些内容发生更改时,所需的值不存在,这会导致意外行为或崩溃。
理想情况下,如果其中一个键发生变化,我想生成一个NSError,我可以使用它来打印已更改的值,帮助我更快地找到更改并纠正它。
我现在能够提出的唯一替代方法是混乱且不可维护。
-(id)initWithDictionary:(NSDictionary*)dictionary andError:(NSError**)error
{
if(self = [super init]){
BOOL _parsedSuccessfully = TRUE;
if (_parsedSuccessfully) {
_ID = [dictionary valueForKey: kKEY_ID];
if (!_ID){
_parsedSuccessfully = FALSE;
*error = [NSError parsingErrorFromKey: kKEY_ID];
}
}
if (_parsedSuccessfully) {
_name = [dictionary valueForKey: kKEY_NAME];
if (!_name){
_parsedSuccessfully = FALSE;
*error = [NSError parsingErrorFromKey: kKEY_NAME];
}
}
if (_parsedSuccessfully) {
_nestedObject = [[NestedObject alloc]initWithDictionary:[dictionary valueForKey:kKEY_NESTED_OBJECT]];
if (!_nestedObject){
_parsedSuccessfully = FALSE;
*error = [NSError parsingErrorFromKey: kKEY_NESTED_OBJECT];
}
}
//etc...
if (!_parsedSuccessfully) {
return nil;
}
}
return self
}
我想知道是否有其他人有更好的方法,最好使用更少的重复。
非常感谢任何帮助。
答案 0 :(得分:1)
向对象添加isValid
方法,可以在任何情况下使用,而不仅仅是在从JSON字典初始化时。
- (BOOL)isValid:(NSError **)error {
#define CHECK_NOT_NULL(x, key) if (!x) { \
if (error != NULL) \
*error = [NSError parsingErrorFromKey:key]; \
return NO; \
}
#define CHECK_NOT_EMPTY(x, key) if (!x || ![x length]) { \
if (error != NULL) \
*error = [NSError parsingErrorFromKey:key]; \
return NO; \
}
CHECK_NOT_NULL(_ID, kKEY_ID);
CHECK_NOT_EMPTY(_name, kKEY_NAME);
// etc.
return YES;
#undef CHECK_NOT_NULL
#undef CHECK_NOT_EMPTY
}
然后在你的init方法中使用它:
- (id)initWithDictionary:(NSDictionary*)dictionary andError:(NSError**)error
{
if (self = [super init]) {
_ID = [dictionary valueForKey: kKEY_ID];
_name = [dictionary valueForKey: kKEY_NAME];
// etc.
if (![self isValid:error]) {
self = nil; // Assuming ARC
}
}
return self;
}
答案 1 :(得分:0)
如果您创建了一个密钥数组,那么您可以在一个循环中运行检查,这样您就只有一个循环副本。
同样,使用数组,您可以从字典中获取所有键并将它们相互删除。一种方法会给你新的钥匙,另一种方式会给你丢失的钥匙。