簡體   English   中英

如何在 Swift 中更改為類型顯示的文本表示?

[英]How can I change the textual representation displayed for a type in Swift?

如何修改在字符串插值中顯示的文本輸出?

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}

有沒有辦法改變實例的顯示方式?

斯威夫特 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])

自定義描述將出現在您的 Playground 中:

在此處輸入圖片說明

另請參閱CustomDebugStringConvertible ,您可以在調試期間將其用於更詳細的輸出。


使用說明

您可以從任何類型初始化String而無需實現此協議。 例如:

在此處輸入圖片說明

出於這個原因,文檔說:

因此,不鼓勵使用CustomStringConvertible作為通用約束或直接訪問符合類型的description

相關的 Apple Swift 文檔

蘋果提供了這個例子:

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 中,使用CustomStringConvertible相關文檔鏈接)而不是Printable

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

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

這似乎是操場上的一個錯誤。 如果您實際編譯並正常運行程序,它會打印:

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

正如預期的那樣。

您應該在https://bugreport.apple.com 上報告此問題

作為 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) - 它仍將使用描述

如果您打開控制台視圖:查看 -> 助理編輯器 -> 顯示助理編輯器,您可以看到在 xCode 6.3.2 和 Yosimite 10.10 中檢查的預期打印行

在此處輸入圖片說明

AppCode提供了一個Generate| debugDescription Generate| debugDescription和``生成| 說明`。 比為具有許多成員的結構鍵入它們要好得多。

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM