Swift'de bir tür için görüntülenen metinsel gösterimi nasıl değiştirebilirim?


93

Dize enterpolasyonunda görüntülenen metin çıktısını nasıl değiştirebilirim?

PrintableProtokol en belirgin görünüyor ama hem Dize Enterpolasyondaki ihmal ve oluyor örneği basarken, örneğin:

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

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

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

Aynı şekilde toString()konvansiyonun da hiçbir etkisi yoktur:

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)

Yapılar için kendi String temsilini kullanan PlayGround'da davranış yine farklıdır, yani:

p // {x 10, y 20}

Bir örneğin görüntülenme şeklini değiştirmenin bir yolu var mı?


Yukarıdaki kod, Xcode 6.3 beta 4'teki Oyun Alanlarında beklendiği gibi çalışır
carbo18

Yanıtlar:


113

Hızlı 2-4

Özet

CustomStringConvertibleProtokole uyun ve ekleyin description:

var description: String {
    return "description here"
}

Misal

Bazı yapılar oluşturabilirsiniz:

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)."
    }
}

Onları başlatırsanız:

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])

Özel açıklamalar oyun alanınızda görünecektir:

görüntü açıklamasını buraya girin

Ayrıca CustomDebugStringConvertible, hata ayıklama sırasında daha ayrıntılı çıktı için kullanabileceğinize bakın.


Kullanım Notu

Bir başlatabilir Stringher türünden olmadan bu protokolü uygulayan. Örneğin:

görüntü açıklamasını buraya girin

Bu nedenle, dokümanlar şöyle diyor:

Bu nedenle, CustomStringConvertiblegenel bir kısıtlama olarak kullanılması veya uygun bir türe descriptiondoğrudan erişilmesi önerilmez.


37

İlgili Apple Swift Belgeleri

Apple şu örneği sağlar:

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

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

Bunu oyun alanında denerseniz, aldığınız sorunun aynısını alırsınız ( V11lldb_expr...). Oyun alanında, başlatıcıyı aradığınızda sağ tarafta açıklamayı görürsünüz, ancak printlnokunaklı bir şey döndürmez.

Ancak oyun alanı dışında, bu kod beklediğiniz gibi davranır. Hem kodunuz hem de Apple'ın yukarıdaki örnek kodu, descriptionoyun alanı dışında bir bağlamda kullanıldığında doğru yazdırır .

Oyun alanında bu davranışı değiştirebileceğinizi sanmıyorum. Aynı zamanda bir hata da olabilir.

DÜZENLEME : Bunun bir hata olduğundan oldukça eminim; Apple'a bir hata raporu gönderdim.

GÜNCELLEME : yerine Swift 2'de, Printablekullanın CustomStringConvertible( ilgili doc bağlantısını ).

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

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


1

Swift 5 + 'da bir alternatif olarak String.StringInterpolation'ı genişletebilirsiniz.

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

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

Bu değer değişecek print("\(p)") ama değil için print(p)- hala açıklama kullanacağı


0

Konsol görünümünü açarsanız: Görünüm -> Yardımcı Düzenleyici -> Yardımcı Düzenleyiciyi Göster, Yosimite 10.10 ile xCode 6.3.2'de Kontrol Edilen Beklenen yazdırma satırlarını görebilirsiniz.

görüntü açıklamasını buraya girin


0

AppCodebir Generate| debugDescriptionve `` Oluştur | description`. Onları birçok üyesi olan bir yapı için yazarak atıyor.

görüntü açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.