Swift เทียบเท่ากับ Java toString()
เพื่อพิมพ์สถานะของอินสแตนซ์คลาสได้อย่างไร
Swift เทียบเท่ากับ Java toString()
เพื่อพิมพ์สถานะของอินสแตนซ์คลาสได้อย่างไร
คำตอบ:
description
คุณสมบัติคือสิ่งที่คุณกำลังมองหา นี่คือคุณสมบัติที่เข้าถึงเมื่อคุณพิมพ์ตัวแปรที่มีอ็อบเจ็กต์
คุณสามารถเพิ่มdescription
ในชั้นเรียนของคุณเองได้โดยใช้โปรโตคอลCustomStringConvertible
จากนั้นจึงใช้description
คุณสมบัติ
class MyClass: CustomStringConvertible {
var val = 17
public var description: String { return "MyClass: \(val)" }
}
let myobj = MyClass()
myobj.val = 12
print(myobj) // "MyClass: 12"
description
ยังใช้เมื่อคุณเรียกตัวString
สร้าง:
let str = String(myobj) // str == "MyClass: 12"
นี่เป็นวิธีที่แนะนำสำหรับการเข้าถึงคำอธิบายอินสแตนซ์ (ซึ่งตรงข้ามกับวิธีmyobj.description
ที่จะใช้ไม่ได้หากคลาสไม่ได้ใช้CustomStringConvertible
)
String(obj)
?
.debugDescription
มีรุ่นที่เป็นมิตรกับโปรแกรมเมอร์อีกด้วย
ถ้าเป็นไปได้ที่จะใช้ struct แทนคลาสก็ไม่ต้องทำอะไรเพิ่มเติม
โครงสร้างเพียงแค่พิมพ์ตัวเองไปยังเอาต์พุต
print("\(yourStructInstance)")
หรือกับชั้นเรียนเช่นนี้:
print(String(describing: yourClassInstance))
คุณควรใช้String(obj)
.
โดยตรงจากเอกสารสำหรับ CustomStringConvertible :
บันทึก
สตริง (อินสแตนซ์) จะทำงานสำหรับอินสแตนซ์ประเภทใดก็ได้โดยจะส่งคืนคำอธิบายหากอินสแตนซ์เกิดขึ้นเป็น CustomStringConvertible ดังนั้นการใช้ CustomStringConvertible เป็นข้อ จำกัด ทั่วไปหรือการเข้าถึงคำอธิบายของประเภทที่สอดคล้องกันโดยตรงจึงไม่แนะนำ
description()
วิธีการCustomStringConvertible
จะเพียงพอ
NSObject
ชั้นเรียนเพิ่มเติมหากคลาสโมเดลของคุณถูกขยายออกNSObject
คุณต้องแทนที่ตัวแปรdescription
ดังต่อไปนี้:
public override var description: String {
return "\n{\n index: \(self.index),\n"
+ " country: \(self.name),\n"
+ " isoCountryCode: \(self.isoCountryCode),\n"
+ " localeId: \(self.localeId),\n"
+ " flagImageName: \(self.flagImageName!)\n}"
}
คุณสามารถตรวจสอบวิธีการที่ฉันได้ทำมันที่นี่ภายในCountry
ชั้นใน"ห้องสมุด CountryPicker iOS ของสวิฟท์"
หรือเพื่อให้เข้าใจง่ายขึ้นชั้นเรียนและdescription
วิธีการของคุณควรมีลักษณะดังนี้:
public class MyClass: NSObject {
public var memberAttribute = "I'm an attribute"
public override var description: String {
return "My Class member: \(self.memberAttribute)"
}
}
หมายเหตุ:
เนื่องจากคุณกำลังขยายคลาส Modal จากคลาสของคุณNSObject
จึงไม่จำเป็นต้องให้คลาสของคุณสอดคล้องกับCustomStringConvertible
คลาสอีกต่อไปและคุณกำลังลบล้างdescription
ตัวแปรจากNSObject
คลาสนั้นเอง โปรดจำไว้เสมอว่าCustomStringConvertible
ส่วนใหญ่เป็นวิธี Swift ที่บริสุทธิ์ในการบรรลุสิ่งนี้