Чи можливі структури NSLog C (як CGRect або CGPoint)?


413

Я хочу мати змогу налагоджувати структури C, не потребуючи явного введення кожного властивості, з якої вони складаються.

тобто я хочу вміти робити щось подібне:

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

Очевидно, що "% @" не спрацює, звідси і питання.


2
NSLog (@ "% @", CGRectCreateDictionaryRepresentation (rect));
Абхішек Беді

Спробуйте LOG_EXPR з бібліотеки VTPG_Common: vgable.com/blog/tag/log_expr
LearnCocos2D

Відповіді:


806

Ви можете спробувати це:

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

UIKit пропонує ряд функцій , які перетворюють різні структури CG в NSStrings. Причина не працює в тому, що %@позначає об'єкт. A CGPoint- це структура С (і так само і CGRects і CGSizes).


7
З AppKit на OS X вам потрібно буде перейти на, NSPointа потім зателефонувати NSStringFromPoint. Наприклад:NSStringFromPoint(NSPointFromCGPoint(point))
Олексій

19
NSLog (@ "% @", CGRectCreateDictionaryRepresentation (rect));
Абхішек Беді

Подібно до префіксів UI, MK, CL, які, хоча всі мають для нього значення і потребують імпорту відповідного .h-файла, наприклад: UIKit, MapKit, CoreLocation; Чи означає префікс CG, що я повинен імпортувати що-небудь? Якщо ні - це лише конвенція про іменування ?!
Мед

231

Є кілька функцій, таких як:

NSStringFromCGPoint  
NSStringFromCGSize  
NSStringFromCGRect  
NSStringFromCGAffineTransform  
NSStringFromUIEdgeInsets

Приклад:

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

4
Це: "єдина річ у всій розробці iOS, яка є найкориснішою, але найменш відомою" !! Хе
Фетті

7
Примітка. Для розробки какао (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/… ( "Варто зазначити, що ця публікація з попереднього десятиліття насправді представляє лише історичний інтерес " ) тощо.
Fattie

1
Ця відповідь все ще корисна, незважаючи на існування функцій перетворення UIKit, оскільки в інших структурах є інші структури, у яких немає помічників NSStringFrom (наприклад, MKCoordinateRegion).
Грег Белл

10

Ви можете використовувати NSValueдля цього. Об'єкт NSValue - це простий контейнер для одного елемента даних C або Objective-C. Він може вміщувати будь-який з скалярних типів, таких як int, float та char, а також покажчики, структури та ідентифікатори об’єктів.

Приклад:

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

ВИХІД: NSPoint: {10, 30}

Сподіваюся, це допоможе вам.


Дякуємо @Nishant - потрібно для виведення вмісту CMTimeRange, і це зробило трюк. Набагато більше можливостей, ніж NSStringFrom ...
amergin

5

Оскільки зламаний RSS Stack Overflow просто породжує це питання для мене, ось моє майже загальне рішення: JAValueToString

Це дозволяє писати JA_DUMP(cgPoint)та входити в cgPoint = {0, 0}систему.


Я зробив це, і я отримав помилку компіляції. Іноді потрібна адреса вираження властивості чи щось
user4951,

@Jim Thio: макрос налаштований таким чином, що обстежуваний об'єкт повинен бути значенням. (Я не пам'ятаю, чому; щось не в змозі обробити рядки C належним чином.) Словом, призначте свою власність тимчасовій змінній, а потім зателефонуйте JA_DUMP.
Єнс Айтон

5

Так, ви можете використовувати нижче декілька функцій, таких як: Спочатку потрібно перетворити структуру CGPoint в рядок, див. Приклад

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

Наприклад:

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

Подобається це...


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.