目前,我正在检查JSON值是否是NSString
,如果不是,请为属性分配一个默认字符串。这样,如果JSON值为null
,我可以防止应用程序崩溃,并且可以返回具有默认名和姓的User对象。
//用户模型
+ (Email *)getEmailInfoWithDictionary:(id)dict {
Email *email = [[self alloc] init];
if ([dict isKindOfClass:[NSDictionary class]]) {
user.firstname = [NSString checkType:dict[@"firstname"] defaultString:@"John"];
user.lastname = [NSString checkType:dict[@"lastname"] defaultString:@"Smith"];
}
}
return user;
}
// NSString类别方法。
+ (NSString *)checkType:(id)obj defaultString:(NSString *)def {
if (obj == nil || ![obj isKindOfClass:[NSString class]]) {
return def;
}
return obj;
}
但是,我有两个问题。始终检查有关json值的空值是一个好主意,这样您就不会崩溃了吗?我注意到一些不这样做的Objective C教程。让我想知道是否不应该为此担心,并且我应该期望API返回正确的值。我的第二个担心是我使用的方法是一个好主意还是有更好的方法?
最佳答案
我要说的是开始研究Objective-C对nil
的默认处理。在大多数情况下,nil
会做您想要的而不会崩溃。相反,[NSNull null]
设计不佳,是一个长期存在的问题。
@interface NSObject (MyCasting)
- (NSString *)stringOrNil;
- (NSNumber *)numberOrNil;
- (NSDictionary *)dictionaryOrNil;
- (NSArray *)arrayOrNil;
@end
@implementation NSObject (MyCasting)
- (NSString *)stringOrNil {
return [self isKindOfClass:NSString.class] ? (NSString *)self : nil;
}
- (NSNumber *)numberOrNil {
return [self isKindOfClass:NSNumber.class] ? (NSNumber *)self: nil;
}
- (NSDictionary *)dictionaryOrNil {
return [self isKindOfClass:NSDictionary.class] ? (NSDictionary *)self: nil;
}
- (NSArray *)arrayOrNil {
return [self isKindOfClass:NSArray.class] ? (NSArray *)self: nil;
}
@end
使用
nil
作为默认值将为您提供良好的安全性。+ (Email *)getEmailInfoWithDictionary:(id)dict {
Email *email = [[self alloc] init];
NSDictionary *dictionary = [dict dictionaryOrNil];
email.firstname = [dictionary[@"firstname"] stringOrNil];
email.lastname = [dictionary[@"lastname"] stringOrNil];
return email;
}
如果您觉得需要额外的对象默认值安全性,则可以使用
?:
运算符。email.firstname = [dictionary[@"firstname"] stringOrNil] ?: "";
email.lastname = [dictionary[@"lastname"] stringOrNil] ?: "";
关于ios - objective-c :检查JSON值是否是您期望的类型,这是一种好习惯吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53094258/