web-dev-qa-db-fra.com

Est-il possible de NSLog C Structs (comme CGRect ou CGPoint)?

Je veux pouvoir déboguer les structures C sans avoir à taper explicitement toutes les propriétés qui les composent.

je veux être capable de faire quelque chose comme ceci:

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

Évidemment, le '% @' ne fonctionnera pas, d'où la question.

408
mazniak

Vous pouvez essayer ceci:

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

Il existe un certain nombre de fonctions fournies par UIKit qui convertissent les différentes structures CG en NSStrings. Cela ne fonctionne pas parce que %@ signifie un objet. Une CGPoint est une structure C (tout comme CGRects et CGSizes).

798
Alex

Il y a quelques fonctions comme:

NSStringFromCGPoint  
NSStringFromCGSize  
NSStringFromCGRect  
NSStringFromCGAffineTransform  
NSStringFromUIEdgeInsets

Un exemple:

NSLog(@"rect1: %@", NSStringFromCGRect(rect1));
229
steve
NSLog(@"%@", CGRectCreateDictionaryRepresentation(rect));
16
Abhishek Bedi

J'utilise la macro suivante pour m'aider avec 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)

Vous pouvez faire quelque chose de similaire pour CGPoint:

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

En l'utilisant comme suit:

LogCGPoint(cgPoint);

Produirait ce qui suit:

cgPoint: (100, 200)
13
e.James

Vous pouvez utiliser NSValue pour cela. Un objet NSValue est un simple conteneur pour un élément de données C ou Objective-C. Il peut contenir n'importe quel type de scalaire tel que int, float et char, ainsi que des pointeurs, des structures et des identifiants d'objet.

Exemple:

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

OUTPUT:NSPoint: {10, 30}

J'espère que ça vous aide.

9
Nishant Tyagi

Depuis que RSS brisé par Stack Overflow vient de me faire revivre cette question, voici ma solution quasi générale: JAValueToString

Cela vous permet d'écrire JA_DUMP(cgPoint) et d'obtenir cgPoint = {0, 0} enregistré.

5
Jens Ayton

Oui, vous pouvez utiliser ci-dessous quelques fonctions telles que: Vous devez d’abord convertir la structure CGPoint en chaîne, voir exemple.

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

Par exemple:

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

Comme ça...

5
Vaibhav Shiledar
NSLog(@"%@",CGRectCreateDictionaryRepresentation(rect));
3
Uday.M