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

myt*_*thz 85 swift

如何修改字符串插值中显示的文本输出?

Printable协议看起来最明显,但在字符串插值和打印实例时都被忽略,例如:

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

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

    func toString() -> String {
        return description
    }
}
Run Code Online (Sandbox Code Playgroud)

同样,该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)
Run Code Online (Sandbox Code Playgroud)

PlayGround中的行为再次不同,它使用自己的String表示结构,即:

p // {x 10, y 20}
Run Code Online (Sandbox Code Playgroud)

有没有办法可以改变实例的显示方式?

Aar*_*ger 104

斯威夫特2 - 4

摘要

符合CustomStringConvertible协议并添加description:

var description: String {
    return "description here"
}
Run Code Online (Sandbox Code Playgroud)

您可以创建一些结构:

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)."
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你初始化它们:

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])
Run Code Online (Sandbox Code Playgroud)

自定义说明将显示在您的操场上:

在此输入图像描述

另请参阅CustomDebugStringConvertible,您可以在调试期间使用更详细的输出.


使用说明

您可以在实现此协议的情况下String从任何类型初始化a .例如:

在此输入图像描述

出于这个原因,文档说:

因此不鼓励使用CustomStringConvertible作为通用约束或description直接访问符合类型.


Cez*_*cik 37

相关Apple Swift文档

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"
Run Code Online (Sandbox Code Playgroud)

如果你在游乐场试试这个,你会遇到同样的问题(V11lldb_expr...).在游乐场中,当您调用初始化程序时,您会在右侧获得描述,但println不会返回清晰易读的内容.

但是,在游乐场外,此代码的行为与您期望的一样.description当您在非游乐场环境中使用时,您的代码和Apple上面的示例代码都会正确打印.

我认为你不能在游乐场改变这种行为.它也可能只是一个错误.

编辑:我很确定这是一个错误; 我向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"
Run Code Online (Sandbox Code Playgroud)