É 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.


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


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

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


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)

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ê.


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.


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...


2
NSLog(@"%@",CGRectCreateDictionaryRepresentation(rect));
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.