1. 사전 프로젝트 코드 세팅하고 오기
https://growingsaja.tistory.com/869
2. dictionary 데이터 간단히 출력해보는 실습 소스코드
// vim ViewController.m
// ViewController.h 파일을 import하여 해당 클래스의 정의를 가져옵니다.
#import "ViewController.h"
// MARK: - [헤더 [선언부] 호출]
@interface ViewController ()
@end
@implementation ViewController
// MARK: - [클래스 설명]
/*
// -----------------------------------------
1. ViewController (구현부)
2. ios 13 이상 사용 : API_AVAILABLE(ios(13.0))
// -----------------------------------------
*/
// MARK: - [뷰 로드 실시]
// 메서드를 구현합니다. 이 메서드는 뷰 컨트롤러의 뷰가 메모리에 로드된 후에 호출되는 메서드입니다.
- (void)viewDidLoad {
// 부모 클래스인 UIViewController의 viewDidLoad 메서드를 호출합니다.
[super viewDidLoad];
NSLog(@"[ViewController >> viewDidLoad() :: 뷰 로드 실시]");
}
// MARK: - [뷰 로드 완료]
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
NSLog(@"[ViewController >> viewWillAppear() :: 뷰 로드 완료]");
}
// MARK: - [뷰 화면 표시]
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
NSLog(@"[ViewController >> viewDidAppear() :: 뷰 화면 표시]");
[self testMain];
}
// MARK: - [뷰 정지 상태]
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
NSLog(@"[ViewController >> viewWillDisappear() :: 뷰 정지 상태]");
}
// MARK: - [뷰 종료 상태]
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
NSLog(@"[ViewController >> viewDidDisappear() :: 뷰 종료 상태]");
}
- (void)testMain {
NSLog(@"[ViewController >> testMain() :: 테스트 메소드 수행]");
/*
// ------------------------------------
[요약 설명]
// ------------------------------------
1. 딕셔너리는 key , value 값을 가지는 객체입니다 (자바에서 hashmap 개념)
// ------------------------------------
*/
// [초기 변수 선언 실시]
NSDictionary *dic = @{@"key_1" : @"value_1", @"key_2" : @"value_2"};
// [저장된 개수 출력]
NSInteger count = [dic count];
// [전체 로그 출력 실시]
NSLog(@"count :: %li", count);
NSLog(@"dicData :: %s", dic.description.UTF8String);
// [key 리스트 출력 실시]
NSArray *keyList = [dic allKeys];
NSLog(@"key :: %s", keyList.description.UTF8String);
// [value 리스트 출력 실시]
NSArray *valueList = [dic allValues];
NSLog(@"value :: %s", valueList.description.UTF8String);
// [개별 특정 key 값 데이터 출력 실시]
NSString *key_1 = dic[@"key_1"];
NSLog(@"key_1 :: %s", key_1.description.UTF8String);
}
// -----------------------------------------
@end
// -----------------------------------------
3. dictionary 데이터 간단히 출력해보는 실습 결과 예시
4. json, dictionary 변환 및 data type 감지해 type에 따라 다른 처리 수행 예시 - ViewController.m 소스 코드 수정
// vim ViewController.m
// ViewController.h 파일을 import하여 해당 클래스의 정의를 가져옵니다.
#import "ViewController.h"
// MARK: - [헤더 [선언부] 호출]
@interface ViewController ()
@end
@implementation ViewController
// MARK: - [클래스 설명]
/*
// -----------------------------------------
1. ViewController (구현부)
2. ios 13 이상 사용 : API_AVAILABLE(ios(13.0))
// -----------------------------------------
*/
// MARK: - [뷰 로드 실시]
// 메서드를 구현합니다. 이 메서드는 뷰 컨트롤러의 뷰가 메모리에 로드된 후에 호출되는 메서드입니다.
- (void)viewDidLoad {
// 부모 클래스인 UIViewController의 viewDidLoad 메서드를 호출합니다.
[super viewDidLoad];
NSLog(@"[ViewController >> viewDidLoad() :: 뷰 로드 실시]");
}
// MARK: - [뷰 로드 완료]
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
NSLog(@"[ViewController >> viewWillAppear() :: 뷰 로드 완료]");
}
// MARK: - [뷰 화면 표시]
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
NSLog(@"[ViewController >> viewDidAppear() :: 뷰 화면 표시]");
// [테스트 메인 함수 호출]
[self testMain];
}
// MARK: - [뷰 정지 상태]
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
NSLog(@"[ViewController >> viewWillDisappear() :: 뷰 정지 상태]");
}
// MARK: - [뷰 종료 상태]
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
NSLog(@"[ViewController >> viewDidDisappear() :: 뷰 종료 상태]");
}
// MARK: - [헤더 파일에 정의 없이 : void 메소드 구현]
- (void)testMain {
NSLog(@"[ViewController >> testMain() :: 테스트 메소드 수행]");
// [초기 인풋 배열, 딕셔너리 데이터 선언 실시]
NSMutableArray *mutableArray = [[NSMutableArray alloc] init];
[mutableArray addObject:@"하나"];
[mutableArray addObject:@"둘"];
NSMutableDictionary *mutableDic = [[NSMutableDictionary alloc] init];
[mutableDic setObject:@"투케이" forKey:@"name"];
[mutableDic setObject:@29 forKey:@"age"];
// [json 생성 딕셔너리 선언 실시]
NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];
[dic setObject:@"value_1" forKey:@"key_1"];
[dic setObject:@10 forKey:@"key_2"];
[dic setObject:@true forKey:@"key_3"];
[dic setObject:mutableArray forKey:@"key_4"];
[dic setObject:mutableDic forKey:@"key_5"];
// [json 형식 문자열을 저장할 변수 선언 실시]
NSString *jsonData = @"";
// [try catch finally 구문 선언 실시]
@try {
NSLog(@"[dic to json [구문 시작]] \n");
// [딕셔너리 >> json 데이터 포맷 수행 실시]
NSData *dicData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil];
jsonData = [[NSString alloc] initWithData:dicData encoding:NSUTF8StringEncoding];
NSLog(@"[dic to json [데이터 포맷] : %s]", jsonData.description.UTF8String);
NSLog(@"[json to dic [구문 시작]]");
// [json >> 딕셔너리 데이터 포맷 수행 실시]
NSData *parseData = [jsonData dataUsingEncoding:NSUTF8StringEncoding];
NSJSONReadingOptions readingOptions = NSJSONReadingMutableContainers; // 옵션 변경
NSMutableDictionary *parseDic = [NSJSONSerialization JSONObjectWithData:parseData options:readingOptions error:nil];
// [for 문을 수행해서 json >> 딕셔너리로 변환한 데이터 출력 실시]
for (NSString *keyData in parseDic.allKeys){
// [value 데이터 확인 실시]
NSObject *obj = [parseDic objectForKey:keyData];
// [value 데이터 타입 확인 실시]
NSString *checkType = [NSString stringWithFormat:@"%@" , [obj class]];
checkType = checkType.lowercaseString; // 소문자 변환
// [타입 별 value 데이터 출력 실시]
int plusJson = 0; // 배열, 딕셔너리 데이터 세부 json 재포맷 여부
if ([checkType rangeOfString:@"array"].location == NSNotFound){
// MARK: [일반 형식인 경우]
if ([checkType rangeOfString:@"dictionary"].location == NSNotFound){
// [데이터 삽입]
plusJson = 0;
}
// MARK: [딕셔너리 형식인 경우]
else {
// [데이터 삽입]
plusJson = 1;
}
}
// MARK: [배열 형식인 경우]
else {
// [데이터 삽입]
plusJson = 2;
}
// [세부 json 형식 포맷 여부 확인]
if (plusJson == 1){ // 딕셔너리 세부 json 포맷
NSMutableDictionary *copyDic = [NSMutableDictionary dictionaryWithDictionary:(NSDictionary *)obj];
NSData *copyDicData = [NSJSONSerialization dataWithJSONObject:copyDic options:NSJSONWritingPrettyPrinted error:nil];
NSString *copyDicJson = [[NSString alloc] initWithData:copyDicData encoding:NSUTF8StringEncoding];
NSLog(@"[dic for [key] :: %s]", keyData.description.UTF8String);
NSLog(@"[dic for [value] [type] :: %s]", checkType.description.UTF8String);
NSLog(@"[dic for [value] [data] :: %s]", copyDicJson.description.UTF8String);
}
else if (plusJson == 2){ // 배열 세부 json 포맷
NSMutableArray *copyArray = [NSMutableArray arrayWithObject:obj];
NSData *copyArrayData = [NSJSONSerialization dataWithJSONObject:copyArray options:NSJSONWritingPrettyPrinted error:nil];
NSString *copyArrayJson = [[NSString alloc] initWithData:copyArrayData encoding:NSUTF8StringEncoding];
NSLog(@"[dic for [key] :: %s]", keyData.description.UTF8String);
NSLog(@"[dic for [value] [type] :: %s]", checkType.description.UTF8String);
NSLog(@"[dic for [value] [data] :: %s]", copyArrayJson.description.UTF8String);
}
else { // 일반 출력
NSString *valueData = [NSString stringWithFormat:@"%@" , parseDic[keyData]];
NSLog(@"[dic for [key] :: %s] \n", keyData.description.UTF8String);
NSLog(@"[dic for [value] [type] :: %s]", checkType.description.UTF8String);
NSLog(@"[dic for [value] [data] :: %s]", valueData.description.UTF8String);
}
}
} @catch (NSException *exception) {
NSLog(@"[catch [name] :: %s]", exception.name.description.UTF8String);
NSLog(@"[catch [reason] :: %s]", exception.reason.description.UTF8String);
}
}
// -----------------------------------------
@end
// -----------------------------------------
5. json, dictionary 변환 및 data type 감지해 type에 따라 다른 처리 수행 예시 - 결과 예시