NSDictionary 는 모델 과 사랑 하고 죽 입 니 다.
모델 에 값 을 부여 합 니 다 \ # \ #
문제 의 대부분 근원 은 데이터 가 모델 데이터 로 분 석 된 것 입 니 다. 여 기 는 맵 이 라 고 할 수 밖 에 없습니다. JSon 에서 대응 하 는 필드 의 내용 을 모델 에 대응 하 는 속성 에 할당 합 니 다.
JFCustomerModel *customerModel = [[JFCustomerModel alloc] init];
[customerModel setValuesForKeysWithDictionary:dic];
customerModel.bankAccount = dic[@"bankAccount"];
customerModel.bankName = dic[@"bankName"];
customerModel.clientAddress = dic[@"clientAddress"];
customerModel.clientMobile = dic[@"clientMobile"];
customerModel.clientName = dic[@"clientName"];
customerModel.contractNo = dic[@"contractNo"];
customerModel.customerType = dic[@"customerType"];
너 는 아마 이렇게 할 것 이다. 그러나 나 는 너 에 게 이렇게 하지 않 아 도 최적화 할 수 있다 고 말 할 수 있다.
- (NSArray *)allPropertyNames
{
unsigned count;
objc_property_t *properties = class_copyPropertyList([self class], &count);
NSMutableArray *rv = [NSMutableArray array];
unsigned i;
for (i = 0; i < count; i++)
{
objc_property_t property = properties[i];
NSString *name = [NSString stringWithUTF8String:property_getName(property)];
[rv addObject:name];
}
free(properties);
return rv;
}
- (void)setModelValueWithDictionary:(NSDictionary *)dictionary
{
NSArray *properties = [self allPropertyNames];
for (NSString *name in properties) {
NSLog(@"%@",name);
NSString * val;
id obj=dictionary[name];
if((obj == nil || [obj isKindOfClass:[NSNull class]])){
val= @"";
}else if([obj isKindOfClass:[NSString class]]){
val = obj;
}else if([obj isKindOfClass:[NSNumber class]]){
val = [obj stringValue];
}
//dictionary[name];
[self setValue:val forKey:name];
}
}
이것 은 동적 으로 모델 의 모든 속성 을 얻 고 runtime 을 사 용 했 지만 OC 가 우리 에 게 방법 을 봉 해 주 었 고 매우 간단 하 다 고 말 하고 싶 습 니 다.
[customerModel setValuesForKeysWithDictionary:dic];
그러나 이 방법 은 몇 가지 주의해 야 할 것 이 있다.
-(void)setValue:(id)value forUndefinedKey:(NSString *)key;
NSDictionary 해석 값 은 NSNULL \ # \ #
이 경우 프로그램 붕 괴 를 초래 할 수 있 습 니 다. 특히 골 치 아 픕 니 다. nil 타 입 이 라면 다 좋 지만 이 NSNULL 타 입 을 판단 하지 않 고 사용 하면 프로그램 붕 괴 를 초래 할 수 있 습 니 다.디 스 플레이 할 때 판단 을 해 보 려 고 했 는데 이렇게 수정 하 는 부분 이 너무 많아 서 원천 적 으로 데 이 터 를 처리 할 지 생각 해 봤 는데 판단 을 내리 지 않 고 마지막 에 NSDictionary 를 직접 개조 해서 방법 을 추 가 했 습 니 다. 값 을 받 았 을 때 NSNULL 형식 이면 @ "이 라 고 NSDictionary 의 분 류 를 적 었 습 니 다.
@implementation NSDictionary (JFEXtension)
- (NSDictionary *)dictionaryByReplacingNullsWithBlanks {
const NSMutableDictionary *replaced = [self mutableCopy];
const id nul = [NSNull null];
const NSString *blank = @"";
for (NSString *key in self) {
id object = [self objectForKey:key];
if (object == nul) [replaced setObject:blank forKey:key];
else if ([object isKindOfClass:[NSDictionary class]]) [replaced setObject:[object dictionaryByReplacingNullsWithBlanks] forKey:key];
}
return [NSDictionary dictionaryWithDictionary:[replaced copy]];
}
@end
이렇게 데 이 터 를 분석 하기 전에 이 방법 을 떨 어 뜨 려 보 세 요. 여기 서 이 방법 은 한 층 의 데이터 만 적용 할 수 있 고 그 사전 에 사전 을 설치 한 데 이 터 는 적용 되 지 않 지만 여러 번 이 방법 을 호출 할 수 있 습 니 다. 관건 은 이해 해 야 합 니 다.
모델 데이터 교환 값 \ # \ #
인터페이스 에서 분 석 된 데 이 터 는 당신 이 원 하 는 데이터 가 아 닐 수도 있 습 니 다. 예 를 들 어 1 대표 신분증, 2 대표 학 번 · · · · 등 두 가지 상황 이 있 습 니 다.
NSString \ # \ # \ # \ #
이 경우 속성 set 방법 을 다시 쓸 수 있 습 니 다.
- (void)setClientName:(NSString *)clientName
{
if ([clientName isEqualToString:@" "]) {
_clientName = @" ";
}else if([clientName isEqualToString:@" "]){
_clientName = @" ";
}else{
_clientName = clientName;
}
}
전 달 된 값 은 보 여줄 값 형식 과 다 릅 니 다. 전 달 된 것 은 NSNumber 형식 이 고, 전 달 된 것 은 NSString 형식 입 니 다. \ # \ # \ # \ # \ #
이 경우 속성 을 다시 추가 하고 get 방법 을 다시 써 야 합 니 다.
- (NSString *)tradeTypeStr
{
if ([_tradeType isEqual:@1]) {
_tradeTypeStr = @" ";
}else if([_tradeType isEqual:@2]){
_tradeTypeStr = @" ";
}else if([_tradeType isEqual:@3]){
_tradeTypeStr = @" ";
}
return _tradeTypeStr;
}
여기 trade Type 은 모델 에 대한 속성 명 을 해석 하고 trade Type Str 는 보 여줄 속성 명 입 니 다.
결어
이상 은 이번 프로젝트 에서 만 나 는 비교적 집중 적 인 부분 입 니 다. 더 좋 은 방법 이 있 거나 잘못 쓴 부분 이 있 으 면 지적 해 주 십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.