Возможно ли NSLog C Структуры (например, CGRect или CGPoint)?

409

Я хочу иметь возможность отлаживать структуры C, не указывая явно каждое свойство, из которого они состоят.

то есть. Я хочу иметь возможность сделать что-то вроде этого:

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

Очевидно, что "% @" не будет работать, следовательно, вопрос.

  • 2
    NSLog (@ "% @", CGRectCreateDictionaryRepresentation (rect));
  • 0
    Попробуйте LOG_EXPR из библиотеки VTPG_Common : vgable.com/blog/tag/log_expr
Теги:
cocoa
cocoa-touch

8 ответов

809
Лучший ответ

Вы можете попробовать следующее:

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

Существует ряд функций предоставляемых UIKit, которые преобразуют различные структуры CG в NSString s. Причина, по которой это не работает, состоит в том, что %@ означает объект. A CGPoint является структурой C (и, следовательно, CGRect и CGSize s).

  • 0
    отлично но работает только с Cocoa-touch :(
  • 7
    С AppKit на OS X вам нужно будет преобразовать в NSPoint и затем вызвать NSStringFromPoint . Например: NSStringFromPoint(NSPointFromCGPoint(point))
Показать ещё 4 комментария
235

Есть несколько функций, таких как:

NSStringFromCGPoint  
NSStringFromCGSize  
NSStringFromCGRect  
NSStringFromCGAffineTransform  
NSStringFromUIEdgeInsets

Пример:

NSLog(@"rect1: %@", NSStringFromCGRect(rect1));
  • 4
    Это: «единственная вещь во всех разработках iOS, которая наиболее полезна, но наименее известна» !! Хех
  • 5
    Примечание: для разработки Какао (OS X) эти функции не имеют "CG" в названии.
16
NSLog(@"%@", CGRectCreateDictionaryRepresentation(rect));
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 ?
  • 0
    Сейчас сделаю. Это именно те функции, которые Алекс и Стив опубликовали в своих ответах.
Показать ещё 2 комментария
9

Вы можете использовать NSValue для этого. Объект NSValue - это простой контейнер для одного элемента данных C или Objective-C. Он может содержать любой из скалярных типов, таких как int, float и char, а также указатели, структуры и идентификаторы объектов.

Пример:

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

ВЫХОД: NSPoint: {10, 30}

Надеюсь, это поможет вам.

  • 0
    Спасибо @Nishant - нужно было выводить содержимое CMTimeRange, и это помогло. Гораздо больше возможностей, чем NSStringFrom ...
5

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

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

Например:

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

Как это...

5

Так как Stack Overflows broken RSS просто воскресил этот вопрос для меня, это мое почти общее решение: JAValueToString

Это позволяет писать JA_DUMP(cgPoint) и записывать cgPoint = {0, 0}.

  • 0
    Я сделал это, и я получил ошибку компиляции. Иногда требуется адрес выражения свойства или что-то
  • 0
    @Jim Thio: макрос настроен так, что проверяемый объект должен быть lvalue. (Я не могу вспомнить почему; что-то из-за невозможности правильно обрабатывать строки C). Короче говоря, присвойте свое свойство временной переменной, а затем вызовите JA_DUMP для этого.
1
NSLog(@"%@",CGRectCreateDictionaryRepresentation(rect));

Ещё вопросы

Сообщество Overcoder
Наверх
Меню