Apakah Mungkin untuk NSLog C Structs (Seperti CGRect atau CGPoint)?

413

Saya ingin dapat men-debug struktur C tanpa harus secara eksplisit mengetik setiap properti yang mereka terdiri.

yaitu saya ingin dapat melakukan sesuatu seperti ini:

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

Jelas '% @' tidak akan berfungsi, maka pertanyaannya.

Mazniak
sumber
2
NSLog (@ "% @", CGRectCreateDictionaryRepresentation (rect));
Abhishek Bedi
Coba LOG_EXPR dari perpustakaan VTPG_Common
LearnCocos2D

Jawaban:

806

Anda dapat mencoba ini:

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

Ada sejumlah fungsi yang disediakan oleh UIKit yang mengubah berbagai struct CG menjadi NSStrings. Alasan itu tidak berhasil adalah karena %@menandakan objek. A CGPointadalah struct C (dan CGRects dan CGSizes).

Alex
sumber
7
Dengan AppKit pada OS X Anda harus mengonversi ke NSPointdan kemudian menelepon NSStringFromPoint. Sebagai contoh:NSStringFromPoint(NSPointFromCGPoint(point))
Alex
19
NSLog (@ "% @", CGRectCreateDictionaryRepresentation (rect));
Abhishek Bedi
Mirip dengan UI, MK, awalan CL yang semuanya memiliki makna dan perlu mengimpor file .h masing-masing seperti: UIKit, MapKit, CoreLocation; Apakah awalan CG berarti saya harus mengimpor sesuatu? Jika tidak apakah ini hanya konvensi penamaan ?!
Sayang
231

Ada beberapa fungsi seperti:

NSStringFromCGPoint  
NSStringFromCGSize  
NSStringFromCGRect  
NSStringFromCGAffineTransform  
NSStringFromUIEdgeInsets

Sebuah contoh:

NSLog(@"rect1: %@", NSStringFromCGRect(rect1));
steve
sumber
4
Ini adalah: "satu hal dalam semua pengembangan iOS yang paling berguna tetapi paling tidak diketahui" !! Heh
Fattie
7
Catatan: untuk pengembangan Cocoa (OS X), fungsi-fungsi ini tidak memiliki "CG" pada namanya.
peterflynn
17
NSLog(@"%@", CGRectCreateDictionaryRepresentation(rect));
Abhishek Bedi
sumber
13

Saya menggunakan makro berikut untuk membantu saya dengan 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)

Anda bisa melakukan hal serupa untuk CGPoint:

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

Menggunakannya sebagai berikut:

LogCGPoint(cgPoint);

Akan menghasilkan yang berikut:

cgPoint: (100, 200)
e.James
sumber
6
Mengapa tidak menggunakan Fungsi Konversi Tali UIKit bawaan ?
ma11hew28
Saya lakukan sekarang. Itulah fungsi-fungsi yang diposting oleh Alex dan steve dalam jawaban mereka.
e.James
1
Apakah perlu mengedit jawaban dan menambahkan catatan di bagian atas "Hanya untuk kepentingan bersejarah ...". Saya selalu melakukan itu, misalnya stackoverflow.com/questions/402/iphone-app-in-landscape-mode/… stackoverflow.com/questions/5492479/… stackoverflow.com/questions/4212628/… ( "Perlu dicatat bahwa posting ini dari dekade sebelumnya, sekarang benar-benar hanya menarik bersejarah. " ) dll
Fattie
1
Jawaban ini masih berguna, meskipun ada fungsi konversi UIKit, karena ada struct lain dalam kerangka kerja lain, yang tidak memiliki NSStringFrom helpers (mis. MKCoordinateRegion).
Greg Bell
10

Anda bisa menggunakannya NSValueuntuk ini. Sebuah NSValue objek adalah wadah sederhana untuk C tunggal atau Objective-C item data. Ia dapat menampung semua jenis skalar seperti int, float, dan char, serta pointer, struktur, dan id objek.

Contoh:

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

OUTPUT: NSPoint: {10, 30}

Semoga ini bisa membantu Anda.

Nishant Tyagi
sumber
Terima kasih @Nishant - diperlukan untuk menampilkan konten CMTimeRange dan ini berhasil. Lebih banyak kemungkinan daripada NSStringFrom ...
amergin
5

Karena RSS Stack Overflow yang rusak baru saja membangkitkan kembali pertanyaan ini untuk saya, inilah solusi saya yang hampir umum: JAValueToString

Ini memungkinkan Anda menulis JA_DUMP(cgPoint)dan cgPoint = {0, 0}login.

Jens Ayton
sumber
Saya melakukan itu dan saya mendapat kesalahan kompilasi. Terkadang alamat ekspresi properti diperlukan atau sesuatu
user4951
@ Jim Thio: makro diatur sedemikian rupa sehingga objek yang diperiksa harus bernilai tinggi. (Saya tidak ingat mengapa; sesuatu tentang tidak bisa menangani string C dengan benar kalau tidak.) Singkatnya, tetapkan properti Anda ke variabel sementara, lalu panggil JA_DUMP untuk itu.
Jens Ayton
5

Ya, Anda dapat menggunakan beberapa fungsi di bawah ini seperti: Pertama, Anda harus mengubah struct CGPoint menjadi string, lihat contoh

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

Sebagai contoh:

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

Seperti ini...

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