NSLog C Yapıları (CGRect veya CGPoint gibi) mümkün mü?


413

C yapılarında hata ayıklamak için, içerdikleri her özellik açıkça yazmak zorunda kalmadan istiyorum.

Yani böyle bir şey yapmak istiyorum:

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

Açıkçası '% @' işe yaramayacak, dolayısıyla soru.


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

VTPG_Common kütüphanesinden LOG_EXPR deneyin: vgable.com/blog/tag/log_expr
LearnCocos2D 16:13

Yanıtlar:


806

Bunu deneyebilirsiniz:

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

Çeşitli CG yapılarını s'ye dönüştüren UIKit tarafından sağlanan bir dizi işlev vardır NSString. Çalışmamasının nedeni %@bir nesneyi göstermesidir. A CGPointbir C yapısıdır ( CGRects ve CGSizes de öyle).


7
OS X'te AppKit ile bir NSPointve sonra çağrıya dönüştürmeniz gerekir NSStringFromPoint. Örneğin:NSStringFromPoint(NSPointFromCGPoint(point))
Alex

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

UI, MK, CL öneklerine benzer, ancak bunların hepsi anlamlıdır ve ilgili bir .h dosyasını içe aktarması gerekir: UIKit, MapKit, CoreLocation; CG öneki herhangi bir şeyi içe aktarmam gerektiği anlamına mı geliyor? Değilse sadece bir adlandırma kuralı mı ?!
Bal

231

Gibi birkaç işlevi vardır:

NSStringFromCGPoint  
NSStringFromCGSize  
NSStringFromCGRect  
NSStringFromCGAffineTransform  
NSStringFromUIEdgeInsets

Bir örnek:

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

4
Bunlar: "tüm iOS geliştirmelerinde en yararlı olan ancak en az bilinen tek şey" !! Heh
Fattie

7
Not: Cocoa (OS X) geliştirme için, bu işlevlerin adında "CG" yoktur.
peterflynn


13

NSRect ile bana yardım etmek için aşağıdaki makroyu kullanıyorum:

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

CGPoint için benzer bir şey yapabilirsiniz:

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

Aşağıdaki gibi kullanarak:

LogCGPoint(cgPoint);

Aşağıdakileri üretir:

cgPoint: (100, 200)


Ben şimdi yapmak. Bunlar, Alex ve Steve'in cevaplarında yayınladıkları işlevlerdir.
James James

1
Cevabı düzenlemeye ve en üste bir not eklemeye değer mi ? Bunu her zaman yaparım, örneğin stackoverflow.com/questions/402/iphone-app-in-landscape-mode/… stackoverflow.com/questions/5492479/… stackoverflow.com/questions/4212628/… ( "Buna dikkat etmek gerekir önceki on yıl bu yazı, gerçekten sadece tarihi ilgi. " ) vb
Fattie

1
Bu cevap, UIKit dönüştürme işlevlerinin varlığına rağmen hala yararlıdır, çünkü diğer çerçevelerde NSStringFrom yardımcıları olmayan (örn. MKCoordinateRegion) başka yapılar da vardır.
Greg Bell

10

Bunun için kullanabilirsiniz NSValue. Bir NSValue nesnesi, tek bir C veya Objective-C veri öğesi için basit bir kapsayıcıdır. İnt, float ve char gibi skaler tiplerin yanı sıra işaretçiler, yapılar ve nesne kimlikleri tutabilir.

Misal:

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

ÇIKTI : NSPoint: {10, 30}

Umarım size yardımcı olur.


Teşekkürler @Nishant - CMTimeRange içeriğinin çıktısı için gerekli ve bu hile yaptı. NSString'den çok daha fazla olasılık ...
amergin

5

Stack Overflow'un bozuk RSS'si bu soruyu benim için yeniden dirilttiği için, neredeyse genel çözümüm: JAValueToString

Bu, yazmanıza JA_DUMP(cgPoint)ve cgPoint = {0, 0}giriş yapmanıza olanak tanır .


Bunu yaptım ve derleme hatası aldım. Bazen özellik ifadesinin adresi gerekli veya başka bir şey
user4951

@Jim Thio: Makro, denetlenen nesnenin bir değer olması gerektiği şekilde ayarlanır. (Nedenini hatırlayamıyorum; C dizelerini düzgün bir şekilde işleyememe hakkında bir şey.) Kısacası, mülkünüzü geçici bir değişkene atayın, ardından JA_DUMP'u arayın.
Jens Ayton

5

Evet, aşağıdaki gibi birkaç işlevi kullanabilirsiniz: Öncelikle CGPoint yapısını dizeye dönüştürmeniz gerekir, örneğe bakın

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

Örneğin:

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

Bunun gibi...


2
NSLog(@"%@",CGRectCreateDictionaryRepresentation(rect));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.