मैं स्विफ्ट में एक प्रकार के लिए प्रदर्शित पाठ प्रतिनिधित्व को कैसे बदल सकता हूं?


91

मैं स्ट्रिंग इंटरपोलेशन में प्रदर्शित होने वाले टेक्स्टुअल आउटपुट को कैसे संशोधित कर सकता हूं?

Printableप्रोटोकॉल सबसे स्पष्ट दिखता है, लेकिन यह दोनों स्ट्रिंग अंतर्वेशन में नजरअंदाज कर दिया और है उदाहरण के मुद्रण जब, जैसे:

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}

क्या कोई तरीका है जो मैं बदल सकता हूं कि एक उदाहरण कैसे प्रदर्शित किया जाए?


उपरोक्त कोड के रूप में Xcode 6.3
Play

जवाबों:


112

स्विफ्ट 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, जिसे आप डीबगिंग के दौरान अधिक वर्बोज़ आउटपुट के लिए उपयोग कर सकते हैं।


उपयोग नोट

आप इस प्रोटोकॉल को लागू किए बिनाString किसी भी प्रकार से आरंभ कर सकते हैं । उदाहरण के लिए:

यहां छवि विवरण दर्ज करें

इस कारण से, डॉक्स कहते हैं:

CustomStringConvertibleएक सामान्य बाधा के रूप में उपयोग करना , या एक अनुरूप प्रकार की descriptionसीधे पहुंच , इसलिए हतोत्साहित किया जाता है।


37

प्रासंगिक Apple स्विफ्ट डॉक्स

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 को एक बग रिपोर्ट प्रस्तुत की।

अद्यतन : स्विफ्ट 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 पर देनी चाहिए


0

यदि आप कंसोल दृश्य खोलते हैं: दृश्य -> ​​सहायक संपादक -> सहायक संपादक दिखाएँ, तो आप उम्मीद कर सकते हैं कि प्रिंट लाइनों को देखा जाए। XCode 6.3.2 में Yosimite 10.10 के साथ जाँच की गई।

यहां छवि विवरण दर्ज करें


0

स्विफ्ट 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

AppCodeप्रदान करता है Generate| debugDescriptionऔर `` उत्पन्न | वर्णन करें। कई सदस्यों के साथ एक संरचना के लिए उन्हें टाइपिंग बीट्स।

यहां छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.