1. ホーム
  2. swift

[解決済み] Swift で型に表示されるテキスト表現を変更するにはどうしたらいいですか?

2022-12-12 09:59:44

質問

文字列補間で表示されるテキスト出力を変更するにはどうしたらよいでしょうか。

文字列補間の際に表示される Printable プロトコルは最も明白に見えますが、これは文字列補間とインスタンスの印刷の両方で無視されます。

struct Point : Printable
{
    var x = 0
    var y = 0

    var description : String {
        return "(\(x), \(y))"
    }

    func toString() -> String {
        return description
    }
}

同様に toString() の規約も何の効果もありません。

var p = Point(x: 10, y: 20)

println(p)                   // V11lldb_expr_05Point (has 2 children)
println("\(p)")              // V11lldb_expr_05Point (has 2 children)
println(p.description)       // (10, 20)
println("\(p.description)")  // (10, 20)

PlayGroundでは、構造体に対して独自のString表現を使用するため、動作がまた異なります。

p // {x 10, y 20}

インスタンスの表示方法を変更する方法はありますか?

どのように解決するのですか?

スウィフト2~4

概要

に準拠する。 CustomStringConvertible プロトコルに準拠し description :

var description: String {
    return "description here"
}


いくつかの構造体を作成することができます。

struct Animal : CustomStringConvertible {
    let type : String

    var description: String {
        return type
    }
}

struct Farm : CustomStringConvertible {
    let name : String
    let animals : [Animal]

    var description: String {
        return "\(name) is a \(self.dynamicType) with \(animals.count) animal(s)."
    }
}

初期化すれば

let oldMajor = Animal(type: "Pig")
let boxer = Animal(type: "Horse")
let muriel = Animal(type: "Goat")

let orwellsFarm = Farm(name: "Animal Farm", animals: [oldMajor, boxer, muriel])

カスタムディスクリプションは、プレイグラウンドに表示されます。

参照 CustomDebugStringConvertible を参照してください。これは、デバッグ時にもっと詳細な出力をするために使うことができます。


使用上の注意

を初期化することができます。 String を初期化することができます。 を使わずに がこのプロトコルを実装している場合。例えば

このため、docsでは

使用方法 CustomStringConvertible を一般的な制約として使うか、適合する型の description に直接アクセスすることは、それゆえ推奨されません。