Czy jest możliwe NSLog Struct C (jak CGRect lub CGPoint)?


413

Chcę mieć możliwość debugowania struktur C bez konieczności jawnego wpisywania każdej właściwości, z której się składają.

tzn. chcę móc zrobić coś takiego:

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

Oczywiście „% @” nie będzie działać, stąd pytanie.


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

Spróbuj LOG_EXPR z biblioteki VTPG_Common: vgable.com/blog/tag/log_expr
LearnCocos2D

Odpowiedzi:


806

Możesz spróbować:

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

Istnieje wiele funkcji udostępnianych przez UIKit, które przekształcają różne struktury CG w NSStrings. Powodem, dla którego nie działa, jest to, że %@oznacza obiekt. A CGPointjest strukturą C (podobnie jak CGRects i CGSizes).


7
Z AppKit na OS X musisz przekonwertować na, NSPointa następnie zadzwonić NSStringFromPoint. Na przykład:NSStringFromPoint(NSPointFromCGPoint(point))
Alex,

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

Podobne do prefiksów UI, MK, CL, które choć mają dla niego znaczenie i muszą zaimportować odpowiedni plik .h, taki jak: UIKit, MapKit, CoreLocation; Czy przedrostek CG oznacza, że ​​powinienem coś zaimportować? Jeśli nie, czy to tylko konwencja nazewnictwa ?!
Honey,

231

Istnieje kilka funkcji, takich jak:

NSStringFromCGPoint  
NSStringFromCGSize  
NSStringFromCGRect  
NSStringFromCGAffineTransform  
NSStringFromUIEdgeInsets

Przykład:

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

4
Są to: „jedna rzecz w całym rozwoju iOS, która jest najbardziej użyteczna, ale najmniej znana” !! Heh
Fattie

7
Uwaga: w przypadku rozwoju Cocoa (OS X) funkcje te nie mają w nazwie nazwy „CG”.
peterflynn


13

Używam następującego makra, aby pomóc mi z 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)

Możesz zrobić coś podobnego dla CGPoint:

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

Używając go w następujący sposób:

LogCGPoint(cgPoint);

Spowoduje to:

cgPoint: (100, 200)

6
Dlaczego nie skorzystać z wbudowanych funkcji konwersji ciągów UIKit ?
ma11hew28,

Ja teraz. Są to funkcje, które Alex i Steve opublikowali w swoich odpowiedziach.
e.James

1
Czy warto byłoby zredagować odpowiedź i dodać notatkę u góry „Tylko dla celów historycznych ...”. Zawsze to robię, na przykład stackoverflow.com/questions/402/iphone-app-in-landscape-mode/… stackoverflow.com/questions/5492479/… stackoverflow.com/questions/4212628/... ( „Warto to zauważyć ten post z poprzedniej dekady jest teraz naprawdę tylko historyczny. ” ) itp.
Fattie

1
Ta odpowiedź jest nadal przydatna, pomimo istnienia funkcji konwersji UIKit, ponieważ istnieją inne struktury w innych ramach, które nie mają pomocników NSStringFrom (np. MKCoordinateRegion).
Greg Bell

10

Możesz NSValuedo tego użyć . Obiekt NSValue to prosty kontener dla pojedynczego elementu danych C lub Objective-C. Może przechowywać dowolne typy skalarne, takie jak int, float i char, a także wskaźniki, struktury i identyfikatory obiektów.

Przykład:

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

WYNIK : NSPoint: {10, 30}

Mam nadzieję, że to ci pomoże.


Dzięki @Nishant - potrzebne do wyświetlenia zawartości CMTimeRange i to załatwiło sprawę. Znacznie więcej możliwości niż NSStringFrom ...
amergin

5

Ponieważ zepsuty kanał RSS przepełnienia stosu właśnie wskrzesił to pytanie, oto moje prawie ogólne rozwiązanie: JAValueToString

To pozwala pisać JA_DUMP(cgPoint)i być cgPoint = {0, 0}zalogowanym.


Zrobiłem to i dostałem błąd kompilacji. Czasami wymagany jest adres wyrażenia własności lub coś takiego
user4951

@Jim Thio: makro jest skonfigurowane w taki sposób, że kontrolowany obiekt musi być wartością. (Nie pamiętam dlaczego; coś w związku z tym, że inaczej nie jesteśmy w stanie poprawnie obsługiwać ciągów C.) Krótko mówiąc, przypisz swoją właściwość do zmiennej tymczasowej, a następnie wywołaj JA_DUMP w tej sprawie.
Jens Ayton

5

Tak, możesz użyć kilku funkcji, takich jak: Najpierw musisz przekonwertować strukturę CGPoint na ciąg, patrz przykład

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

Na przykład:

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

Lubię to...


2
NSLog(@"%@",CGRectCreateDictionaryRepresentation(rect));
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.