使用swift时,有没有简单的方法可以在xcode 13.1中打印数组对象



我正在使用swift编写音乐播放器插件,现在我想检查xcode 13.1中的音乐队列数组。我正在做的是在xcode终端中使用lldb,如下所示:

(lldb) po queue
▿ 2 elements
▿ 0 : <MusicMetadata: 0x600003e41c00>
▿ 1 : <MusicMetadata: 0x600003e71620>

这个命令只输出元素的顶层,但现在我想检查元素的详细信息,然后我试着这样做:

(lldb) p print(String(data: try! JSONSerialization.data(withJSONObject: queue, options: .prettyPrinted), encoding: .utf8)!)
error: Execution was interrupted, reason: internal ObjC exception breakpoint(-5)..
The process has been returned to the state before expression evaluation.

有什么简单的方法可以检查数组吗?为什么不能像Intellij Idea一样在Xcode中查看数组对象?我也试过这样做:

(lldb) po print(queue)
[music_player.MusicMetadata, music_player.MusicMetadata]
0 elements

您的MusicMetadata类型需要符合CustomStringConvertable,以便po命令在这种情况下输出任何有用的内容。这个协议只是您定义MusicMetadata类型如何作为字符串表示的一种方式。

struct MusicMetadata {
let title: String
let artist: String
}
extension MusicMetadata: CustomStringConvertible {
var description: String {
"title: (title), artist: (artist)"
}
}
let testMusic = MusicMetadata(title: "fooTitle", artist: "fooArtist")
let testMusic2 = MusicMetadata(title: "barTitle", artist: "barTitle")
let queue = [
MusicMetadata(title: "fooTitle", artist: "fooArtist"),
MusicMetadata(title: "barTitle", artist: "barTitle"),
]
queue.description // "[title: fooTitle, artist: fooArtist, title: barTitle, artist: barTitle]"

由于queue是一个数组(因此符合Sequence协议(,因此有几种方法可以输出MusicMetadata值的字符串表示:

如果您无法添加一致性,而只是想验证值/对象上的一个或多个属性,则可以使用数组是Sequence这一事实,并使用mapMusicMetadata类型的数组转换为只有一个属性的数组,然后从那里的输出中转换它们。

扩展上面的示例,因为title属性是String,所以您可以简单地使用joined(separator:)方法来输出

po queue.map { $0.title }.joined(separator: ", ") // fooTitle, barTitle

最新更新