如何在Xcode Playground右侧栏自定义类型的展示形式?
嘿,这个问题我太熟了——CustomStringConvertible确实管不了Playground右侧栏的自定义展示,苹果专门给Playground设计了一个更强大的协议:CustomPlaygroundDisplayConvertible,这才是你需要的工具。
先给你拆解一下怎么解决:
第一步:用CustomPlaygroundDisplayConvertible定制专属展示
这个协议只要求你实现一个playgroundDescription属性,返回你想在右侧栏展示的任意内容——字符串、字典、甚至是SwiftUI/UIKit视图都可以,完全看你的需求。
针对你提到的结构体默认展示混乱的问题,咱们直接重写它的展示逻辑:
struct YourCustomStruct: CustomPlaygroundDisplayConvertible { let rawValue: Int let nestedGroups: [[Any]] let extraProperties: [String] // 核心就是这个属性,自定义展示内容 var playgroundDescription: Any { // 返回一个结构清晰的字典,替代默认的杂乱格式 return [ "Raw Value": rawValue, "Nested Group Count": nestedGroups.count, "First Group Preview": nestedGroups.first ?? "Empty", "Extra Properties": extraProperties.joined(separator: ", ") ] } } // 测试实例 let testInstance = YourCustomStruct( rawValue: 10, nestedGroups: [[1,2], [3,4]], extraProperties: ["alpha", "beta"] )
这样右侧栏就会显示结构清晰的字典内容,再也不会是{rawValue 10} {{…}, {…}} {{…}}这种看不懂的格式了。
第二步:进阶玩法——用视图实现可视化展示
如果想让展示更直观,还可以返回SwiftUI或者UIKit视图,Playground会直接渲染出来:
import SwiftUI struct YourCustomStruct: CustomPlaygroundDisplayConvertible { let rawValue: Int let nestedGroups: [[Any]] var playgroundDescription: Any { VStack(alignment: .leading, spacing: 8) { Text("Custom Struct Details") .font(.title) .bold() Divider() Text("Raw Value: \(rawValue)") Text("Nested Groups (\(nestedGroups.count)):") ForEach(nestedGroups.indices, id: \.self) { idx in Text("Group \(idx+1): \(nestedGroups[idx])") .padding(.leading, 16) } } .padding() .background(Color.blue.opacity(0.1)) .cornerRadius(10) } }
这时候右侧栏会直接显示这个排版整齐的SwiftUI视图,比纯文字展示更直观。
补充:优化控制台输出的小技巧
如果你同时想让print()或者debug控制台的输出更清晰,可以额外遵循CustomDebugStringConvertible协议,实现debugDescription属性,但这和Playground右侧栏的展示是分开的——Playground会优先使用CustomPlaygroundDisplayConvertible的内容来定制专属展示。
总结一下,核心就是用CustomPlaygroundDisplayConvertible替代CustomStringConvertible来定制Playground右侧栏的展示,根据你的需求返回不同类型的内容就行。
内容的提问来源于stack exchange,提问作者Justin Milo

