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.


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


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

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


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)

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.


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.


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


2
NSLog(@"%@",CGRectCreateDictionaryRepresentation(rect));
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.