Возможно ли 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является структурой C (как и CGRects и CGSizes).


7
С AppKit на OS X вам нужно будет преобразовать в NSPointи затем вызвать NSStringFromPoint. Например:NSStringFromPoint(NSPointFromCGPoint(point))
Алекс

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

Подобно префиксам UI, MK, CL, которые хотя и имеют смысл, и им необходимо импортировать соответствующий файл .h, например: UIKit, MapKit, CoreLocation; Означает ли префикс CG, что я должен что-то импортировать? Если нет, это просто соглашение об именах ?!
Honey

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/… ( «Стоит отметить, что этот пост из предыдущего десятилетия действительно сейчас представляет только исторический интерес. " ) и т. д.
Толстяк

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: макрос настроен таким образом, что проверяемый объект должен быть lvalue. (Я не могу вспомнить почему; что-то из-за неспособности правильно обрабатывать строки 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.