Posted at

Swift のカスタムオブジェクトを print する時に key: value 形式で表示させる

More than 3 years have passed since last update.

Swift のカスタムオブジェクトを print すると、デフォルトだとクラス名が表示されるはず。

これを key: value のように求める形で表示させるには description プロパティをいじればいいのだが、全てのカスタムクラスに実装するのは大変なので、今回 NSOjbect を継承するクラスを作って、そのクラスを継承させることで解決するアプローチを取ってみた。

具体的には以下の様なコード。Mirror の children を map で回して key: value 形式の文字列を返して、できた配列を改行コード(\n)でつないだものを return している。

tanabee/CustomObject.swift

import UIKit

class CustomObject: NSObject {

override var description: String {
let mirror = Mirror(reflecting: self)
return mirror.children.map { (element) -> String in
let key = element.label ?? "Undefined"
let value = element.value
if value is CustomObject || value is NSArray {
return "\(key): \(value.dynamicType)"
} else {
return "\(key): \(value)"
}
}.joinWithSeparator("\n")
}

}

A というクラスを key: value で吐かせるためには以下のように設定すれば良い

class A: CustomObject {

// クラス実装
}

なにか他に良い実装方法知ってる方いたら教えて下さい〜。