É possível criar estruturas NSLog C (como CGRect ou CGPoint)?

413

Quero poder depurar estruturas C sem precisar digitar explicitamente todas as propriedades em que elas consistem.

ou seja, eu quero ser capaz de fazer algo assim:

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

Obviamente, o '% @' não funcionará, daí a questão.

mazniak
fonte
2
NSLog (@ "% @", CGRectCreateDictionaryRepresentation (rect));
Abhishek Bedi
Tente LOG_PRESS na biblioteca VTPG_Common: vgable.com/blog/tag/log_expr
LearnCocos2D

Respostas:

806

Você pode tentar isso:

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

Há uma série de funções fornecidas pelo UIKit que convertem as várias estruturas de CG em NSStrings. O motivo pelo qual não funciona é porque %@significa um objeto. A CGPointé uma estrutura C (e também são CGRects e CGSizes).

Alex
fonte
7
Com o AppKit no OS X, você precisaria converter para um NSPointe depois chamar NSStringFromPoint. Por exemplo:NSStringFromPoint(NSPointFromCGPoint(point))
Alex
19
NSLog (@ "% @", CGRectCreateDictionaryRepresentation (rect));
Abhishek Bedi
Semelhante à interface do usuário, MK, CL prefixos que, embora todos tenham significados, precisam importar um arquivo .h respectivo, como: UIKit, MapKit, CoreLocation; O prefixo CG significa que devo importar alguma coisa? Se não, é apenas uma convenção de nomenclatura ?!
16/16 mel
231

Existem algumas funções como:

NSStringFromCGPoint  
NSStringFromCGSize  
NSStringFromCGRect  
NSStringFromCGAffineTransform  
NSStringFromUIEdgeInsets

Um exemplo:

NSLog(@"rect1: %@", NSStringFromCGRect(rect1));
Steve
fonte
4
Estes são os: "coisa única em todo o desenvolvimento do iOS que é mais útil, mas menos conhecida" !! Heh
Fattie
7
Nota: para o desenvolvimento de cacau (OS X), essas funções não possuem "CG" no nome.
Peterflynn 22/07/2015
17
NSLog(@"%@", CGRectCreateDictionaryRepresentation(rect));
Abhishek Bedi
fonte
13

Eu uso a seguinte macro para me ajudar com o 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)

Você poderia fazer algo semelhante ao CGPoint:

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

Utilizando-o da seguinte maneira:

LogCGPoint(cgPoint);

Produziria o seguinte:

cgPoint: (100, 200)
e.James
fonte
6
Por que não usar apenas as funções de conversão de string do UIKit incorporadas ?
ma11hew28
Eu faço agora. Essas são exatamente as funções que Alex e Steve postaram em suas respostas.
e.James
1
Vale a pena editar a resposta e adicionar uma nota no topo "Apenas para interesse histórico ...". Eu sempre faço isso, por exemplo stackoverflow.com/questions/402/iphone-app-in-landscape-mode/… stackoverflow.com/questions/5492479/… stackoverflow.com/questions/4212628/… ( "Vale a pena notar que este post a partir da década anterior, é realmente agora apenas de interesse histórico ". ) etc
Fattie
1
Essa resposta ainda é útil, apesar da existência de funções de conversão do UIKit, porque existem outras estruturas em outras estruturas, que não têm ajudantes NSStringFrom (por exemplo, MKCoordinateRegion).
Greg Sino
10

Você pode usar NSValuepara isso. Um objeto NSValue é um contêiner simples para um único item de dados C ou Objective-C. Ele pode conter qualquer um dos tipos escalares, como int, float e char, além de ponteiros, estruturas e IDs de objetos.

Exemplo:

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

RESULTADO : NSPoint: {10, 30}

Espero que ajude você.

Nishant Tyagi
fonte
Obrigado @Nishant - necessário para gerar o conteúdo de um CMTimeRange e isso fez o truque. Muito mais possibilidades do que o NSStringFrom ...
amergin
5

Como o RSS quebrado do Stack Overflow acabou de ressuscitar essa pergunta para mim, aqui está minha solução quase geral: JAValueToString

Isso permite que você escreva JA_DUMP(cgPoint)e seja cgPoint = {0, 0}logado.

Jens Ayton
fonte
Eu fiz isso e recebi um erro de compilação. Às vezes endereço de expressão propriedade necessária ou algo
user4951
@ Jim Thio: a macro é configurada de tal maneira que o objeto que está sendo inspecionado deve ser um lvalue. (Não me lembro o porquê; algo sobre não poder manipular as seqüências de caracteres C de outra maneira.) Em resumo, atribua sua propriedade a uma variável temporária e chame JA_DUMP nela.
perfil completo de Jens Ayton
5

Sim, você pode usar algumas funções abaixo: Primeiro, você precisa converter a estrutura do CGPoint em string, veja o exemplo

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

Por exemplo:

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

Como isso...

Vaibhav Shiledar
fonte
2
NSLog(@"%@",CGRectCreateDictionaryRepresentation(rect));
UdayM
fonte