1. ホーム
  2. swift

[解決済み] NSObject description]のSwiftでの等価物は何ですか?

2022-04-22 09:58:10

質問

Objective-Cでは description メソッドをそのクラスに追加して、デバッグを支援します。

@implementation MyClass
- (NSString *)description
{
    return [NSString stringWithFormat:@"<%@: %p, foo = %@>", [self class], foo _foo];
}
@end

そして、デバッガで、こうします。

po fooClass
<MyClass: 0x12938004, foo = "bar">

Swiftでは何に相当するのでしょうか?SwiftのREPL出力が参考になる。

  1> class MyClass { let foo = 42 }
  2> 
  3> let x = MyClass()
x: MyClass = {
  foo = 42
}

しかし、コンソールに印刷するために、この動作をオーバーライドしたいのです。

  4> println("x = \(x)")
x = C11lldb_expr_07MyClass (has 1 child)

これをきれいにする方法はあるのでしょうか println 出力?を見たことがあります。 Printable プロトコルを使用します。

/// This protocol should be adopted by types that wish to customize their
/// textual representation.  This textual representation is used when objects
/// are written to an `OutputStream`.
protocol Printable {
    var description: String { get }
}

これは自動的にquot;see"されると思いました。 println が、そうではないようです。

  1> class MyClass: Printable {
  2.     let foo = 42
  3.     var description: String { get { return "MyClass, foo = \(foo)" } }
  4. }   
  5> 
  6> let x = MyClass()
x: MyClass = {
  foo = 42
}
  7> println("x = \(x)")
x = C11lldb_expr_07MyClass (has 1 child)

そして、その代わりに明示的にdescriptionを呼び出す必要があります。

 8> println("x = \(x.description)")
x = MyClass, foo = 42

もっといい方法はないのでしょうか?

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

これをSwift型で実装するためには CustomStringConvertible という文字列のプロパティを実装し、さらに description .

例えば

class MyClass: CustomStringConvertible {
    let foo = 42

    var description: String {
        return "<\(type(of: self)): foo = \(foo)>"
    }
}

print(MyClass()) // prints: <MyClass: foo = 42>

type(of: self) は、明示的に 'MyClass' と記述する代わりに、現在のインスタンスの型を取得します。