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.5description 与直接属性
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 反馈 — 无需本地设置。
此课程中的所有课时
- CustomStringConvertible
- CustomDebugStringConvertible
- 使用 Mirror 进行反射
- 构建便于调试的类型