เป็นไปได้ที่โครงสร้าง NSLog C (เช่น CGRect หรือ CGPoint)


413

ฉันต้องการที่จะสามารถแก้ปัญหาโครงสร้าง C โดยไม่ต้องพิมพ์ทุกคุณสมบัติที่พวกเขาประกอบด้วย

เช่นฉันต้องการที่จะสามารถทำอะไรเช่นนี้:

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

เห็นได้ชัดว่า '% @' ไม่ทำงานดังนั้นคำถาม


2
NSLog (@ "% @", CGRectCreateDictionaryRepresentation (rect));
Abhishek Bedi

ลอง LOG_EXPR จากไลบรารีVTPG_Common
LearnCocos2D

คำตอบ:


806

คุณสามารถลองสิ่งนี้:

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

มีฟังก์ชั่นมากมายจาก UIKitที่แปลงโครงสร้าง CG ต่าง ๆ เป็นNSStrings เหตุผลที่มันไม่ทำงานเป็นเพราะ%@หมายถึงวัตถุ A CGPointคือโครงสร้าง C (และเป็นCGRects และCGSizes)


7
ด้วย AppKit บน OS X ที่คุณจะต้องแปลงไปยังและโทรแล้วNSPoint NSStringFromPointตัวอย่างเช่น:NSStringFromPoint(NSPointFromCGPoint(point))
Alex

19
NSLog (@ "% @", CGRectCreateDictionaryRepresentation (rect));
Abhishek Bedi

คล้ายกับ UI, MK, CL นำหน้าซึ่งในขณะที่ทุกคนมีความหมายและจำเป็นต้องนำเข้าไฟล์. h ตามลำดับเช่น: UIKit, MapKit, CoreLocation; คำนำหน้า CG หมายความว่าฉันควรนำเข้าอะไรหรือไม่ ถ้าไม่ได้เป็นเพียงแค่การตั้งชื่อเท่านั้น!
ฮันนี่

231

มีฟังก์ชั่นบางอย่างเช่น:

NSStringFromCGPoint  
NSStringFromCGSize  
NSStringFromCGRect  
NSStringFromCGAffineTransform  
NSStringFromUIEdgeInsets

ตัวอย่าง:

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

4
นี่คือ: "สิ่งเดียวในการพัฒนา iOS ทั้งหมดที่มีประโยชน์มากที่สุด แต่เป็นที่รู้จักน้อยที่สุด" !! Heh
Fattie

7
หมายเหตุ: สำหรับการพัฒนา Cocoa (OS X) ฟังก์ชั่นเหล่านี้ไม่มีชื่อ "CG"
peterflynn


13

ฉันใช้แมโครต่อไปนี้เพื่อช่วยฉันด้วย 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)

คุณสามารถทำสิ่งที่คล้ายกับ CGPoint ได้:

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

ใช้มันดังต่อไปนี้:

LogCGPoint(cgPoint);

จะผลิตดังต่อไปนี้:

cgPoint: (100, 200)

6
ทำไมไม่เพียงใช้ในการสร้างฟังก์ชั่นการแปลง UIKit String ?
ma11hew28

ฉันทำตอนนี้. สิ่งเหล่านี้เป็นหน้าที่ของอเล็กซ์และสตีฟในคำตอบของพวกเขา
e.James

1
มันจะคุ้มค่าการแก้ไขคำตอบและเพิ่มโน้ตที่ด้านบน "เพื่อความสนใจในประวัติศาสตร์เท่านั้น ... " ฉันทำเช่นนั้นเสมอเช่นstackoverflow.com/questions/402/iphone-app-in-landscape-mode/…stackoverflow.com/questions/5492479/… stackoverflow.com/questions/4212628/ ...... ( "มันควรค่าแก่การสังเกตว่า โพสต์นี้จากทศวรรษที่ผ่านมาตอนนี้เป็นเพียงประวัติศาสตร์ที่น่าสนใจเท่านั้น " ) ฯลฯ
Fattie

1
คำตอบนี้ยังคงมีประโยชน์แม้ว่าจะมีฟังก์ชั่นการแปลง UIKit อยู่เนื่องจากมีโครงสร้างอื่น ๆ ในกรอบงานอื่น ๆ ซึ่งไม่มีผู้ช่วย NSStringFrom (เช่น MKCoordinateRegion)
Greg Bell

10

คุณสามารถใช้NSValueสำหรับสิ่งนี้ NSValueวัตถุเป็นภาชนะง่ายสำหรับ C เดียวหรือ Objective-C รายการข้อมูล มันสามารถเก็บสเกลาร์ประเภทใดก็ได้เช่น int, float และ char รวมถึงพอยน์เตอร์โครงสร้างและรหัสวัตถุ

ตัวอย่าง:

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

เอาท์พุท: NSPoint: {10, 30}

หวังว่ามันจะช่วยคุณ


ขอบคุณ @Nishant - ต้องการส่งออกเนื้อหาของ CMTimeRange และนี่เป็นการหลอกลวง ความเป็นไปได้ไกลกว่า NSStringFrom ...
amergin

5

เนื่องจาก RSS ที่ใช้งานไม่ได้ของ Stack Overflow เพิ่งฟื้นคืนชีพคำถามนี้ให้ฉันนี่เป็นวิธีแก้ปัญหาทั่วไปของฉัน: JAValueToString

สิ่งนี้ช่วยให้คุณเขียนJA_DUMP(cgPoint)และcgPoint = {0, 0}เข้าสู่ระบบได้


ฉันทำอย่างนั้นและฉันได้รับข้อผิดพลาดในการรวบรวม บางครั้งที่อยู่ของนิพจน์คุณสมบัติที่ต้องการหรือบางอย่าง
user4951

@Jim Thio: แมโครถูกตั้งค่าในลักษณะที่วัตถุที่ถูกตรวจสอบจะต้องเป็น lvalue (ฉันจำไม่ได้ว่าเพราะอะไรบางอย่างเกี่ยวกับการไม่สามารถจัดการกับสตริง C อย่างเหมาะสม) โดยย่อให้กำหนดคุณสมบัติของคุณให้กับตัวแปรชั่วคราวแล้วเรียก JA_DUMP
Jens Ayton

5

ใช่คุณสามารถใช้ฟังก์ชั่นการร้องดังต่อไปนี้ก่อนอื่นคุณต้องแปลงโครงสร้าง CGPoint เป็นสตริงดูตัวอย่าง

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

ตัวอย่างเช่น:

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

แบบนี้...


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.