0Pricing
Swift Academy · 课时

CustomStringConvertible

为您的类型定义易读的描述。

CustomStringConvertible 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。

什么是自定义字符串表示

该协议允许您控制类型在打印或插入字符串时的显示方式。您需要提供一个 description 属性。

默认形式不够美观

没有该协议时,结构体会打印完整的成员形式,通常会包含过多信息:

struct Point { let x: Int; let y: Int }
print(Point(x: 1, y: 2))  // Point(x: 1, y: 2)

添加 description

遵循该协议并提供 var description: String:

struct Point: CustomStringConvertible {
    let x: Int
    let y: Int
    var description: String { "(\(x), \(y))" }
}
print(Point(x: 1, y: 2))  // (1, 2)

由 print 和 String(describing:) 使用

print 和字符串插值都会使用您的 description:

struct Money: CustomStringConvertible {
    let cents: Int
    var description: String { "$\(Double(cents) / 100)" }
}
let m = Money(cents: 250)
print("price is \(m)")  // price is $2.5

description 与直接属性

description 用于面向用户、便于人类阅读的文本。它并不是为了再解析回原值而设计的,那是另一个问题(Codable)。请保持内容易读。

格式化枚举

为枚举提供友好的名称:

enum Suit: CustomStringConvertible {
    case hearts, spades
    var description: String {
        switch self {
        case .hearts: return "Hearts"
        case .spades: return "Spades"
        }
    }
}
print(Suit.hearts)  // Hearts

组合描述

根据成员的描述构建整体描述:

struct Card: CustomStringConvertible {
    let rank: Int
    let suit: String
    var description: String { "\(rank) of \(suit)" }
}
let cards = [Card(rank: 1, suit: "H"), Card(rank: 13, suit: "S")]
print(cards.map { $0.description })  // ["1 of H", "13 of S"]

在集合中

打印集合时,会调用每个元素的 description:

struct Tag: CustomStringConvertible {
    let name: String
    var description: String { "#\(name)" }
}
print([Tag(name: "swift"), Tag(name: "ios")])  // [#swift, #ios]

插值使用 description

字符串插值会自动获取您的 description:

struct Temperature: CustomStringConvertible {
    let celsius: Int
    var description: String { "\(celsius)C" }
}
let t = Temperature(celsius: 21)
print("Now: \(t)")  // Now: 21C

保持轻量

description 可能会被频繁调用(例如记录日志和调试)。请避免在其中执行繁重的工作,而应根据存储属性计算简单字符串。

struct ID: CustomStringConvertible {
    let value: Int
    var description: String { "ID#\(value)" }
}
print(ID(value: 42))  // ID#42

条件格式化

description 可以根据状态选择不同分支,使文本读起来自然:

struct Stock: CustomStringConvertible {
    let count: Int
    var description: String {
        count == 0 ? "Out of stock" : "\(count) in stock"
    }
}
print(Stock(count: 0))  // Out of stock
print(Stock(count: 5))  // 5 in stock

快速检查

CustomStringConvertible 要求提供哪个属性?

总结

您学习了自定义字符串表示:

  • 提供 var description: String 来生成面向用户的文本
  • 由 print、String(describing:) 和字符串插值使用
  • 保持内容易读且计算开销低;不要以实现往返转换为目标
  • 在集合中也会自动生效

接下来:自定义调试字符串表示。

常见问题解答

「CustomStringConvertible」课时是免费的吗?

是的 — 「CustomStringConvertible」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。

「CustomStringConvertible」这节课中我会学到什么?

为您的类型定义易读的描述。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Swift Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「CustomStringConvertible」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Swift Academy 课中编写并运行代码吗?

能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. CustomStringConvertible
  2. CustomDebugStringConvertible
  3. 使用 Mirror 进行反射
  4. 构建便于调试的类型
← 返回 Swift Academy