![](/img/trans.png)
[英](Swift) How can I get a Data representation of the documentPicker URL
[英]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}
有沒有辦法改變實例的顯示方式?
符合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
。
蘋果提供了這個例子:
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 中檢查的預期打印行
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.