2017-12-14 7 views
1

スーパークラスで実装されているメソッドでオブジェクトの動的な型を判別する必要があります。スーパークラスはBaseClientと呼ばれ、DisplayClientはそれを継承します。スウィフト4:タイプ(of:self).description()はStringとは異なります(説明:type(of:self))

パッケージ名ではなく、クラス名のみが必要です。これは私が試したものです。他の人が唯一のクラス名を返しながら

print("1", String(describing: type(of: self))) // DisplayClient 
print("2", type(of: self))      // DisplayClient 
print("3", type(of: self).description())  // package.DisplayClient 
print("4", "\(type(of: self))")    // DisplayClient 

はなぜ

type(of: self).description() 

戻りpackage.DisplayClientしていますか? Stringを使用するときに内部的に呼び出されるものが不思議です(type :(:self))。私はこれがまさに私が何をしているのかと考えています(())。

文字列が内部的にどのように生成されるかについての詳細はどこにありますか?

docsは言う:

は、Stringインスタンスとしてその好ましい表現に任意の型のインスタンスを変換するには、この初期化子を使用してください。インスタンスはTextOutputStreamableプロトコルに準拠している場合、結果は(全S)instance.writeを呼び出すことによって得られる

  • :上の初期化子は、プロトコル適合性に応じて、以下のいずれかの方法でインスタンスの文字列表現を作成します空の文字列s。
  • インスタンスがCustomStringConvertibleプロトコルに準拠する場合、結果はinstance.descriptionになります。
  • インスタンスがCustomDebugStringConvertibleプロトコルに準拠する場合、結果はinstance.debugDescriptionになります。
  • 不特定の結果は、Swift標準ライブラリによって自動的に提供されます。

しかし、型(of:self)にはdescription属性もありません。これにはdescription()メソッドしかありません。これはコンパイラによって異なる方法で処理される特別なケースですか?

+0

関連:私は文字列を使用しhttps://stackoverflow.com/questions/48306011/swift-4-typeof-self-differs-when-using-private-fileprivate –

答えて

2

あなたのクラスがNSObjectから継承する場合は、type(of: self).description()NSObject.description() class methodを呼び出します。このメソッドの

class func description() -> String 

NSObjectのの実装は、単純にクラスの名前を出力します。

であり、モジュール名が含まれているかどうかは記載されていません。 クラスがNSObjectから継承しない場合、 デフォルトのdescription()メソッドはありません。

一方、

print(String(describing: type(of: self))) // DisplayClient 
print(type(of: self))      // DisplayClient 

両方が修飾されていないタイプの名前を印刷し、

print(String(reflecting: type(of: self))) // package.DisplayClient 
debugPrint(type(of: self))    // package.DisplayClient 

両方が How to get a Swift type name as a string with its namespace (or framework name)Xcode 7 Release Notesを比較し、完全修飾型名を印刷:

タイプ名と列挙型nデフォルトで の資格がない場合は、印刷して文字列に変換します。 debugPrintまたはString(reflecting:)でも、完全修飾名を取得するために を使用できます。

+0

(記述:(タイプ:自己))今それは私のために働く。唯一の問題は、これが公開されていないクラスのいくつかの追加情報を返すことです。例:ファイルプライベートクラスInitialStateに対して "(InitialState in _AF5C6D4A3B423A6F0735A7740F802E5A)"が返されます。しかし、私はコンソール出力(ロギング)にこの情報を使用するだけで大​​きな問題はありません。 クラスをpublicに変更すると、期待通りに "InitialState"が返されます –

+0

:https://stackoverflow.com/質問/ 48306011/swift-4-type-self-different-using-private-fileprivate –

関連する問題