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.