NSLog C Structs (CGRect 또는 CGPoint와 같은)가 가능합니까?


413

구성하는 모든 속성을 명시 적으로 입력하지 않고도 C 구조를 디버깅 할 수 있기를 원합니다.

즉, 나는 이런 식으로 할 수 있기를 원합니다.

CGPoint cgPoint = CGPointMake(0,0);
NSLog(@"%@",cgPoint);

분명히 '% @'는 작동하지 않으므로 질문입니다.


2
NSLog (@ "% @", CGRectCreateDictionaryRepresentation (rect));
Abhishek Bedi 10

VTPG_Common 라이브러리에서 LOG_EXPR을 시도하십시오. vgable.com/blog/tag/log_expr
LearnCocos2D

답변:


806

당신은 이것을 시도 할 수 있습니다 :

NSLog(@"%@", NSStringFromCGPoint(cgPoint));

다양한 CG 구조체를 s 로 변환하는 UIKit 에서 제공 하는 많은 기능이 있습니다 NSString. 작동하지 않는 이유 %@는 객체를 의미 하기 때문 입니다. A는 CGPointC 구조체 (그리고 그렇게되어 CGRectS와 CGSizeS).


7
OS X에서 AppKit을 사용하면로 변환 NSPoint한 다음을 호출해야 NSStringFromPoint합니다. 예 :NSStringFromPoint(NSPointFromCGPoint(point))
Alex

19
NSLog (@ "% @", CGRectCreateDictionaryRepresentation (rect));
Abhishek Bedi 10

UI, MK, CL 접두어는 모두 의미가 있지만 각각의 .h 파일을 다음과 같이 가져와야합니다. UIKit, MapKit, CoreLocation; CG 접두사가 내가 가져와야한다는 의미입니까? 그렇지 않다면 그냥 명명 규칙입니까?!
Honey

231

다음과 같은 몇 가지 기능이 있습니다.

NSStringFromCGPoint  
NSStringFromCGSize  
NSStringFromCGRect  
NSStringFromCGAffineTransform  
NSStringFromUIEdgeInsets

예를 들면 :

NSLog(@"rect1: %@", NSStringFromCGRect(rect1));

4
이것들은 : "가장 유용하지만 가장 알려지지 않은 모든 iOS 개발에서 하나의 것"!! Heh
Fattie

7
참고 : Cocoa (OS X) 개발의 경우 이러한 함수 이름에 "CG"가 없습니다.
peterflynn


13

다음 매크로를 사용하여 NSRect를 쉽게 이해할 수 있습니다.

#define LogRect(RECT) NSLog(@"%s: (%0.0f, %0.0f) %0.0f x %0.0f",
    #RECT, RECT.origin.x, RECT.origin.y, RECT.size.width, RECT.size.height)

CGPoint와 비슷한 것을 할 수 있습니다.

@define LogCGPoint(POINT) NSLog(@"%s: (%0.0f, %0.0f)",
    #POINT POINT.x, POINT.y);

다음과 같이 사용하십시오.

LogCGPoint(cgPoint);

다음을 생성합니다.

cgPoint: (100, 200)

6
왜 내장 UIKit 문자열 변환 함수를 사용하지 않습니까?
ma11hew28

지금 할게. 그것들은 알렉스와 스티브가 대답에 게시 한 기능입니다.
e.James

1
답을 편집하고 상단의 "역사적 관심사에만 해당 ..."에 메모추가 할 가치가 있습니까? 예를 들어 항상 stackoverflow.com/questions/402/iphone-app-in-landscape-mode/… stackoverflow.com/questions/5492479/… stackoverflow.com/questions/4212628/… ( " 지난 10 년 동안의이 포스트는 이제 실제로 역사적인 관심사 일뿐입니다. "
Fattie

1
이 응답은 UIKit 변환 함수의 존재에도 불구하고 NSStringFrom 헬퍼가없는 다른 프레임 워크 (예 : MKCoordinateRegion)가있는 다른 구조체이기 때문에 여전히 유용합니다.
Greg Bell

10

NSValue이것을 위해 사용할 수 있습니다 . NSValue의 목적은 단일 또는 목표 C-C의 데이터 항목에 대한 간단한 컨테이너이다. 포인터, 구조체 및 객체 ID뿐만 아니라 int, float 및 char와 같은 스칼라 유형을 보유 할 수 있습니다.

예:

  CGPoint cgPoint = CGPointMake(10,30);
    NSLog(@"%@",[NSValue valueWithCGPoint:cgPoint]);

출력 : NSPoint: {10, 30}

그것이 당신을 돕기를 바랍니다.


감사합니다 @Nishant-CMTimeRange의 내용을 출력해야했고 이것이 트릭이었습니다. NSStringFrom보다 훨씬 더 가능성이 있습니다.
amergin

5

스택 오버플로의 깨진 RSS 가이 질문을 다시 부활 시켰기 때문에 거의 일반적인 해결책은 다음과 같습니다 .JAValueToString

이것은 당신이 작성할 수 있습니다 JA_DUMP(cgPoint)얻을 cgPoint = {0, 0}기록.


나는 그것을했고 컴파일 오류가 발생했다. 때로는 속성 표현의 주소가 필요하거나
user4951

@Jim Thio : 검사 대상 물체가 lvalue가되도록 매크로를 설정합니다. (왜 그런지 기억이 안납니다. 그렇지 않으면 C 문자열을 제대로 처리 할 수없는 것에 대한 것입니다.) 간단히 말해서 속성을 임시 변수에 할당 한 다음 JA_DUMP를 호출하십시오.
Jens Ayton

5

예, 다음과 같은 몇 가지 함수를 사용할 수 있습니다. 먼저 CGPoint 구조체를 문자열로 변환해야합니다 (예제 참조).

1) NSStringFromCGPoint,  
2) NSStringFromCGSize,  
3) NSStringFromCGRect,  
4) NSStringFromCGAffineTransform,  
5) NSStringFromUIEdgeInsets,

예를 들면 다음과 같습니다.

1) NSLog(@"NSStringFromCGPoint = %@", NSStringFromCGRect(cgPointValue));

이렇게 ...


2
NSLog(@"%@",CGRectCreateDictionaryRepresentation(rect));
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.