ฉันจะเปลี่ยนการแสดงข้อความที่แสดงสำหรับประเภทใน Swift ได้อย่างไร


92

ฉันจะแก้ไขเอาต์พุตข้อความที่แสดงในการแก้ไขสตริงได้อย่างไร

Printableโปรโตคอลลักษณะที่เห็นได้ชัดมากที่สุด แต่ก็ไม่สนใจทั้งใน String แก้ไขและเมื่อพิมพ์ตัวอย่างเช่น:

struct Point : Printable
{
    var x = 0
    var y = 0

    var description : String {
        return "(\(x), \(y))"
    }

    func toString() -> String {
        return description
    }
}

ในทำนองเดียวกันการtoString()ประชุมก็ไม่มีผลเช่นกัน:

var p = Point(x: 10, y: 20)

println(p)                   // V11lldb_expr_05Point (has 2 children)
println("\(p)")              // V11lldb_expr_05Point (has 2 children)
println(p.description)       // (10, 20)
println("\(p.description)")  // (10, 20)

ลักษณะการทำงานแตกต่างกันอีกครั้งใน PlayGround ซึ่งใช้การแทนค่าสตริงของตัวเองสำหรับโครงสร้างเช่น:

p // {x 10, y 20}

มีวิธีเปลี่ยนวิธีการแสดงอินสแตนซ์หรือไม่?


โค้ดด้านบนทำงานได้ตามที่คาดไว้ใน Playgrounds ใน Xcode 6.3 beta 4
คาร์โบ 18

คำตอบ:


113

สวิฟต์ 2 - 4

สรุป

สอดคล้องกับCustomStringConvertibleโปรโตคอลและเพิ่มdescription:

var description: String {
    return "description here"
}

ตัวอย่าง

คุณสามารถสร้างโครงสร้างบางอย่าง:

struct Animal : CustomStringConvertible {
    let type : String

    var description: String {
        return type
    }
}

struct Farm : CustomStringConvertible {
    let name : String
    let animals : [Animal]

    var description: String {
        return "\(name) is a \(self.dynamicType) with \(animals.count) animal(s)."
    }
}

หากคุณเริ่มต้น:

let oldMajor = Animal(type: "Pig")
let boxer = Animal(type: "Horse")
let muriel = Animal(type: "Goat")

let orwellsFarm = Farm(name: "Animal Farm", animals: [oldMajor, boxer, muriel])

คำอธิบายที่กำหนดเองจะปรากฏในสนามเด็กเล่นของคุณ:

ป้อนคำอธิบายภาพที่นี่

ดูเพิ่มเติมCustomDebugStringConvertibleซึ่งคุณสามารถใช้สำหรับเอาต์พุตแบบละเอียดเพิ่มเติมในระหว่างการดีบัก


หมายเหตุการใช้งาน

คุณสามารถเริ่มต้น a Stringจากประเภทใดก็ได้โดยไม่ต้องใช้โปรโตคอลนี้ ตัวอย่างเช่น:

ป้อนคำอธิบายภาพที่นี่

ด้วยเหตุนี้เอกสารจึงกล่าวว่า:

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


37

เอกสาร Apple Swift ที่เกี่ยวข้อง

Apple ให้ตัวอย่างนี้:

struct MyType: Printable {
    var name = "Untitled"
    var description: String {
        return "MyType: \(name)"
    }
}

let value = MyType()
println("Created a \(value)")
// prints "Created a MyType: Untitled"

หากคุณลองสิ่งนี้ในสนามเด็กเล่นคุณจะได้รับปัญหาเดียวกันกับที่คุณได้รับ ( V11lldb_expr...) ในสนามเด็กเล่นคุณจะได้รับคำอธิบายทางด้านขวามือเมื่อคุณเรียกตัวเริ่มต้น แต่printlnไม่ได้ส่งคืนสิ่งที่ชัดเจน

อย่างไรก็ตามโค้ดนี้จะทำงานตามที่คุณคาดไว้ ทั้งรหัสของคุณและรหัสตัวอย่างจาก Apple ด้านบนพิมพ์ถูกต้องdescriptionเมื่อใช้ในบริบทที่ไม่ใช่สนามเด็กเล่น

ฉันไม่คิดว่าคุณจะเปลี่ยนพฤติกรรมนี้ได้ในสนามเด็กเล่น นอกจากนี้ยังอาจเป็นเพียงข้อบกพร่อง

แก้ไข : ฉันค่อนข้างมั่นใจว่านี่เป็นข้อบกพร่อง ฉันส่งรายงานข้อบกพร่องไปยัง Apple

อัปเดต : ใน Swift 2 Printableให้ใช้CustomStringConvertible( ลิงก์เอกสารที่เกี่ยวข้อง ) แทน

struct MyType: CustomStringConvertible {
    var name = "Untitled"
    var description: String {
        return "MyType: \(name)"
    }
}

let value = MyType()
println("Created a \(value)")
// prints "Created a MyType: Untitled"

2

สิ่งนี้ดูเหมือนจะเป็นข้อบกพร่องในสนามเด็กเล่น หากคุณคอมไพล์และรันโปรแกรมตามปกติมันจะพิมพ์ออกมา:

(10, 20)
(10, 20)
(10, 20)
(10, 20)

อย่างที่คาดไว้.

คุณควรรายงานเรื่องนี้ที่https://bugreport.apple.com


1

อีกทางเลือกหนึ่งใน Swift 5+ คุณสามารถขยาย String.StringInterpolation

struct Point {
    var x : Int
    var y : Int
}

extension String.StringInterpolation {
    mutating func appendInterpolation(_ value: Point) {
        appendInterpolation("\(value.x):\(value.y)")
    }
}

ซึ่งจะเปลี่ยนค่าสำหรับ print("\(p)") แต่ไม่ใช่สำหรับprint(p)- ซึ่งจะยังคงใช้คำอธิบาย


0

หากคุณเปิดมุมมองคอนโซล: View -> Assistant Editor -> Show Assistant Editor คุณจะเห็นบรรทัดการพิมพ์ที่คาดไว้ตรวจสอบใน xCode 6.3.2 ด้วย Yosimite 10.10

ป้อนคำอธิบายภาพที่นี่


0

AppCodeให้Generate| debugDescriptionและ `` สร้าง | คำอธิบาย " Beats พิมพ์ออกมาสำหรับโครงสร้างที่มีสมาชิกจำนวนมาก

ป้อนคำอธิบายภาพที่นี่

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