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.