Ist es möglich, NSLog C-Strukturen (wie CGRect oder CGPoint) zu verwenden?


413

Ich möchte in der Lage sein, C-Strukturen zu debuggen, ohne jede Eigenschaft, aus der sie bestehen, explizit eingeben zu müssen.

dh ich möchte in der Lage sein, so etwas zu tun:

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

Offensichtlich wird das '% @' nicht funktionieren, daher die Frage.


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

Versuchen Sie LOG_EXPR aus der VTPG_Common-Bibliothek: vgable.com/blog/tag/log_expr
LearnCocos2D

Antworten:


806

Sie können dies versuchen:

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

Es gibt eine Reihe von Funktionen von UIKit , die die verschiedenen CG-Strukturen in NSStrings konvertieren . Der Grund, warum es nicht funktioniert, ist, dass %@es ein Objekt bedeutet. A CGPointist eine C-Struktur (und CGRects und CGSizes auch).


7
Mit AppKit unter OS X müssten Sie in ein konvertieren NSPointund dann aufrufen NSStringFromPoint. Zum Beispiel:NSStringFromPoint(NSPointFromCGPoint(point))
Alex

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

Ähnlich wie bei UI-, MK- und CL-Präfixen, die zwar alle Bedeutungen haben und eine entsprechende .h-Datei importieren müssen, z. B.: UIKit, MapKit, CoreLocation; Bedeutet das CG-Präfix, dass ich etwas importieren sollte? Wenn nicht, ist es nur eine Namenskonvention?!
Honey

231

Es gibt einige Funktionen wie:

NSStringFromCGPoint  
NSStringFromCGSize  
NSStringFromCGRect  
NSStringFromCGAffineTransform  
NSStringFromUIEdgeInsets

Ein Beispiel:

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

4
Dies sind die: "Einzelsache in der gesamten iOS-Entwicklung, die am nützlichsten, aber am wenigsten bekannt ist" !! Heh
Fattie

7
Hinweis: Für die Cocoa (OS X) -Entwicklung haben diese Funktionen kein "CG" im Namen.
Peterflynn


13

Ich verwende das folgende Makro, um mir bei NSRect zu helfen:

#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)

Sie könnten etwas Ähnliches für CGPoint tun:

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

Verwenden Sie es wie folgt:

LogCGPoint(cgPoint);

Würde folgendes produzieren:

cgPoint: (100, 200)

6
Warum nicht einfach die integrierten UIKit-String-Konvertierungsfunktionen verwenden ?
ma11hew28

Ich mache jetzt. Das sind genau die Funktionen, die Alex und Steve in ihren Antworten gepostet haben.
e.James

1
Wäre es sinnvoll, die Antwort zu bearbeiten und oben eine Notiz hinzuzufügen: "Nur für historisches Interesse ...". Ich mache das immer, zum Beispiel stackoverflow.com/questions/402/iphone-app-in-landscape-mode/… stackoverflow.com/questions/5492479/… stackoverflow.com/questions/4212628/… ( "Es ist erwähnenswert, dass Dieser Beitrag aus dem letzten Jahrzehnt ist jetzt wirklich nur von historischem Interesse. " ) etc
Fattie

1
Diese Antwort ist trotz der Existenz von UIKit-Konvertierungsfunktionen immer noch nützlich, da es andere Strukturen in anderen Frameworks gibt, die keine NSStringFrom-Helfer haben (z. B. MKCoordinateRegion).
Greg Bell

10

Sie können NSValuedies verwenden. Ein NSValue- Objekt ist ein einfacher Container für ein einzelnes C- oder Objective-C-Datenelement. Es kann alle Skalartypen wie int, float und char sowie Zeiger, Strukturen und Objekt-IDs enthalten.

Beispiel:

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

AUSGABE : NSPoint: {10, 30}

Hoffe es hilft dir.


Danke @Nishant - musste den Inhalt eines CMTimeRange ausgeben und das hat den Trick gemacht. Weit mehr Möglichkeiten als NSStringFrom ...
Amergin

5

Da das kaputte RSS von Stack Overflow diese Frage für mich gerade wiederbelebt hat, ist hier meine fast allgemeine Lösung: JAValueToString

Auf diese Weise können Sie schreiben JA_DUMP(cgPoint)und cgPoint = {0, 0}protokolliert werden.


Ich habe das gemacht und einen Kompilierungsfehler bekommen. Manchmal Adresse des Eigenschaftsausdrucks erforderlich oder so
user4951

@ Jim Thio: Das Makro ist so eingerichtet, dass das zu untersuchende Objekt ein Wert sein muss. (Ich kann mich nicht erinnern, warum; etwas daran, dass ich C-Zeichenfolgen sonst nicht richtig verarbeiten kann.) Kurz gesagt, weisen Sie Ihre Eigenschaft einer temporären Variablen zu und rufen Sie dann JA_DUMP auf.
Jens Ayton

5

Ja, Sie können einige der folgenden Funktionen verwenden: Zuerst müssen Sie die CGPoint-Struktur in eine Zeichenfolge konvertieren, siehe Beispiel

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

Zum Beispiel:

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

So was...


2
NSLog(@"%@",CGRectCreateDictionaryRepresentation(rect));
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.