NSDictionary 는 모델 과 사랑 하고 죽 입 니 다.

4922 단어
최근 에 프로젝트 를 하 는데 프로젝트 마무리 과정 에서 작은 문제 가 발생 했 는데 이런 문제 들 은 대부분 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];

그러나 이 방법 은 몇 가지 주의해 야 할 것 이 있다.
  • 사전 의 key 명 은 모델 의 속성 명 과 일치 해 야 합 니 다
  • 모델 에 사전 에 존재 하지 않 는 속성 명 이 존재 할 수 있 지만 사전 이 있 지만 모델 에 없 으 면 프로그램 이 무 너 집 니 다.첫 번 째 구제 방식 은 대응 하 는 값 이 하나 밖 에 없다.이 두 번 째 점 에 대해 서 는 보완 이 있 습 니 다. 모델 에서 이 방법 을 설명 하고 덮어 쓰 십시오. 이 방법 에는 아무것도 쓸 필요 가 없습니다.
  • -(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 는 보 여줄 속성 명 입 니 다.
    결어
    이상 은 이번 프로젝트 에서 만 나 는 비교적 집중 적 인 부분 입 니 다. 더 좋 은 방법 이 있 거나 잘못 쓴 부분 이 있 으 면 지적 해 주 십시오.

    좋은 웹페이지 즐겨찾기