Có thể để NSLog C Structs (Giống như CGRect hoặc CGPoint) không?


413

Tôi muốn có thể gỡ lỗi cấu trúc C mà không cần phải gõ rõ ràng mọi thuộc tính mà chúng bao gồm.

tức là tôi muốn có thể làm một cái gì đó như thế này:

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

Rõ ràng là '% @' sẽ không hoạt động, do đó, câu hỏi.


2
NSLog (@ "% @", CGRectCreateDixiRepftimeation (orth));
Abhishek Bedi

Hãy thử LOG_EXPR từ thư viện VTPG_Common
LearnCocos2D

Câu trả lời:


806

Bạn có thể thử điều này:

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

Có một số chức năng được cung cấp bởi UIKit để chuyển đổi các cấu trúc CG khác nhau thành NSStrings. Lý do nó không hoạt động là vì %@biểu thị một đối tượng. A CGPointlà một cấu trúc C (và CGRects và CGSizes cũng vậy).


7
Với AppKit trên OS X, bạn sẽ cần chuyển đổi thành một NSPointcuộc gọi và sau đó gọi NSStringFromPoint. Ví dụ:NSStringFromPoint(NSPointFromCGPoint(point))
Alex

19
NSLog (@ "% @", CGRectCreateDixiRepftimeation (orth));
Abhishek Bedi

Tương tự như tiền tố UI, MK, CL, trong khi tất cả đều có ý nghĩa với nó và cần nhập tệp .h tương ứng như: UIKit, MapKit, CoreLocation; Tiền tố CG có nghĩa là tôi nên nhập bất cứ thứ gì? Nếu không chỉ là một quy ước đặt tên?!
Mật ong

231

Có một vài chức năng như:

NSStringFromCGPoint  
NSStringFromCGSize  
NSStringFromCGRect  
NSStringFromCGAffineTransform  
NSStringFromUIEdgeInsets

Một ví dụ:

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

4
Đây là: "điều duy nhất trong tất cả các phát triển iOS hữu ích nhất nhưng ít được biết đến nhất" !! Heh
Fattie

7
Lưu ý: để phát triển Ca cao (OS X), các hàm này không có "CG" trong tên.
peterflynn


13

Tôi sử dụng macro sau để giúp tôi với 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)

Bạn có thể làm điều gì đó tương tự cho CGPoint:

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

Sử dụng nó như sau:

LogCGPoint(cgPoint);

Sẽ sản xuất như sau:

cgPoint: (100, 200)

6

Tôi đang làm đây. Đó là những chức năng mà Alex và steve đã đăng trong câu trả lời của họ.
e.

1
Nó có đáng để chỉnh sửa câu trả lời và thêm một ghi chú ở đầu "Chỉ vì lợi ích lịch sử ...". Tôi luôn luôn làm điều đó, ví dụ stackoverflow.com/questions/402/iphone-app-in-landscape-mode/... stackoverflow.com/questions/5492479/... stackoverflow.com/questions/4212628/... ( "Đó là đáng chú ý là bài đăng này từ thập kỷ trước, thực sự bây giờ chỉ là mối quan tâm lịch sử. " ) v.v.
Fattie

1
Câu trả lời này vẫn hữu ích, mặc dù có các hàm chuyển đổi UIKit, bởi vì có các cấu trúc khác trong các khung khác, không có trình trợ giúp NSStringFrom (ví dụ: MKCoordineRegion).
Greg Bell

10

Bạn có thể sử dụng NSValuecho việc này. An đối tượng NSValue là một thùng chứa đơn giản cho một mục dữ liệu C hoặc Objective-C. Nó có thể chứa bất kỳ loại vô hướng nào như int, float và char, cũng như các con trỏ, cấu trúc và id đối tượng.

Thí dụ:

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

ĐẦU RA: NSPoint: {10, 30}

Hy vọng nó sẽ giúp bạn.


Cảm ơn @Nishant - cần thiết để xuất nội dung của CMTimeRange và điều này đã thực hiện thủ thuật này. Nhiều khả năng hơn NSStringFrom ...
amergin

5

Vì RSS bị hỏng của Stack Overflow vừa phục hồi câu hỏi này cho tôi, đây là giải pháp gần như chung của tôi: JAValueToString

Điều này cho phép bạn viết JA_DUMP(cgPoint)và được cgPoint = {0, 0}đăng nhập.


Tôi đã làm điều đó và tôi đã nhận được lỗi biên dịch. Đôi khi, địa chỉ của biểu thức tài sản được yêu cầu hoặc một cái gì đó
user4951

@Jim Thio: macro được thiết lập theo cách mà đối tượng được kiểm tra phải là một giá trị. (Tôi không thể nhớ tại sao; có điều gì đó về việc không thể xử lý chuỗi C đúng cách khác.) Tóm lại, gán thuộc tính của bạn cho một biến tạm thời, sau đó gọi JA_DUMP trên đó.
Jens Ayton

5

Có, bạn có thể sử dụng một số chức năng dưới đây như: Đầu tiên bạn phải chuyển đổi cấu trúc CGPoint thành chuỗi, xem ví dụ

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

Ví dụ:

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

Như thế này...


2
NSLog(@"%@",CGRectCreateDictionaryRepresentation(rect));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.