본문 바로가기

개발/App Developer

구조체(CGPoint,CGSize,CGRect) -> 객체(NSDictionary) -> 구조체

CGPoint, CGSize, CGRect는 구초체 입니다. 
포인터 객체가 아니므로 여기서 사용되는 배열에는 그냥 넣을수가 없습니다.

직접 배열을 만들어 사용한다면 문제 없지만 보통 NSArray나 NS시리즈(?)가 편하기 때문에 
객체화 시킬필요가 있습니다.
CGPoint경우 CGPointCreateDictionaryRepresentation이라는 객체 변환용 함수가 있긴합니다. 
다른 구초체도 마찬가지 입니다. 

하지만 이 함수는 NSDictionary를 돌려주지 않고 CFDictionaryRef라는 객체로 돌려줍니다. 
원래 NSDictionary가 이것에 따서 만들어진거지만,  CF시리즈(?)는 사용하기가 좀 불편합니다. 
[객체 release]가 아닌 CFRelease(객체); 식으로 객체 해제 명령을 따로 해주는 것이죠.

C보다 OC위주로 개발하기를 좋아해서 이런 스타일은 될수있으면 피해가려합니다.

결국 구조체를 객체로 변환해서 만드는 수밖에 없습니다. 그냥 데이터형 객체를 만드는 방법도 있지만 
Plist파일에도 바로 저장하기 쉽도록 NSDictionary로 만듭니다. 

이 소스에서는 OC에서 잘 사용되는 카테고리 기능을 사용한 것입니다. (카테고리는 서적 참조...;;;)

이 소스를 넣고 import로 참조한후 사용하면 됩니다.

사용 예)

- (void)sample {

NSMutableArray *a = [NSMutableArray array];


CGPoint p = CGPointMake(5.0, 6.0);
NSDictionary *pointObject = [NSDictionary dictionaryWithCGPoint:p];
[a addObject:pointObject];


[a addObject:[NSDictionary dictionaryWithCGSize:CGSizeMake(50.0, 60.0)]];

CGRect rect = CGRectMake(20.0, 40.0, 100.0, 60.0);
[a addObject:[NSDictionary dictionaryWithCGRect:rect]];

NSLog(@"%@",a);


CGPoint point = [pointObject CGPointValue];

CGSize size = [[a objectAtIndex:1] CGSizeValue];

CGRect rect2 = [[a objectAtIndex:2] CGRectValue];


NSLog(@"point: %f,%f",point.x,point.y);

NSLog(@"size: %f,%f",size.width,size.height);

NSLog(@"rect: %f,%f,%f,%f",rect2.origin.x,rect2.origin.y,rect2.size.width,rect2.size.height);


}

//

'개발 > App Developer' 카테고리의 다른 글

Notification  (0) 2010.09.01
읽어보자-스마트폰과 위치기반서비스  (0) 2010.09.01
Window and View  (0) 2010.09.01
Enumeraion  (0) 2010.08.31
10.07.06 개발노트  (0) 2010.08.31