如何在Swift中更改为某种类型显示的文本表示形式?


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的行为又有所不同,PlayGround使用自己的String表示结构,即:

p // {x 10, y 20}

有什么方法可以更改实例的显示方式吗?


上面的代码按预期在Xcode 6.3 beta 4的Playgrounds中
起作用

Answers:


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从任何类型初始化a ,而无需实现此协议。例如:

在此处输入图片说明

因此,文档说:

因此,不建议将其CustomStringConvertible用作通用约束或description直接访问符合类型的约束。


37

相关的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不会返回清晰的内容。

但是,在操场外,此代码的行为符合您的预期。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"



0

作为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

AppCode提供了Generate| debugDescription``Generate | 描述`。敲打它们以构造具有许多成员的结构。

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.