เทียบเท่ากับ Java toString () อย่างรวดเร็ว


คำตอบ:


123

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)?
nielsbot

นอกจากนี้ยัง.debugDescriptionมีรุ่นที่เป็นมิตรกับโปรแกรมเมอร์อีกด้วย
nielsbot

2
มันใช้กับโครงสร้าง?
lmiguelvargasf

1
ใช่ CustomStringConvertible แทนที่พิมพ์ได้ @Antonio ฉันจำไม่ได้ว่ามันเปลี่ยนไปเมื่อไหร่ แต่มันนานก่อนที่ Swift 3
vacawama

1
MyClass ต้องขยายจาก NSObject
DàChún

7

ถ้าเป็นไปได้ที่จะใช้ struct แทนคลาสก็ไม่ต้องทำอะไรเพิ่มเติม

โครงสร้างเพียงแค่พิมพ์ตัวเองไปยังเอาต์พุต

print("\(yourStructInstance)")

หรือกับชั้นเรียนเช่นนี้:

print(String(describing: yourClassInstance))

6

คุณควรใช้String(obj).

โดยตรงจากเอกสารสำหรับ CustomStringConvertible :

บันทึก

สตริง (อินสแตนซ์) จะทำงานสำหรับอินสแตนซ์ประเภทใดก็ได้โดยจะส่งคืนคำอธิบายหากอินสแตนซ์เกิดขึ้นเป็น CustomStringConvertible ดังนั้นการใช้ CustomStringConvertible เป็นข้อ จำกัด ทั่วไปหรือการเข้าถึงคำอธิบายของประเภทที่สอดคล้องกันโดยตรงจึงไม่แนะนำ


ดูเหมือนว่าdescription()วิธีการCustomStringConvertibleจะเพียงพอ
Greg Brown

5

ทำได้อย่างไรกับ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 ที่บริสุทธิ์ในการบรรลุสิ่งนี้

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