1. ホーム
  2. swift

Swift - メタタイプ.Typeと.selfの違いは何ですか?

2023-08-12 19:55:07

質問

メタタイプの違いは何ですか? .Type.self をSwiftで使うのですか?

する .self そして .Type を返します。 struct ?

私は、以下のことを理解しています。 .self でチェックすることができます。 dynamicType . どのように .Type ?

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

簡単な例を示します。

func printType<T>(of type: T.Type) {
    // or you could do "\(T.self)" directly and
    // replace `type` parameter with an underscore
    print("\(type)") 
} 

printType(of: Int.self) // this should print Swift.Int


func printInstanceDescription<T>(of instance: T) {
    print("\(instance)")
} 

printInstanceDescription(of: 42) // this should print 42

各エンティティは2つのもので表現されるとします。

  • タイプ # entitiy name #

  • メタタイプです。 # entity name # .Type

<ブロッククオート

メタタイプの型は、クラス型、構造体型、列挙型、プロトコル型など、あらゆる型の型を指します。

ソース

これは再帰的で、以下のような型があることにすぐに気がつくでしょう。 (((T.Type).Type).Type) などがあります。

.Type はメタタイプのインスタンスを返します。

メタタイプのインスタンスを取得する方法は2つあります。

  • 呼び出す .self のような具象型に対して Int.self のような具体的な型があり、その型は 静的 メタタイプのインスタンス Int.Type .

  • を取得します。 ダイナミック メタタイプのインスタンスを type(of: someInstance) .

危険なエリアです。

struct S {}
protocol P {}

print("\(type(of: S.self))")      // S.Type
print("\(type(of: S.Type.self))") // S.Type.Type
print("\(type(of: P.self))")      // P.Protocol
print("\(type(of: P.Type.self))") // P.Type.Protocol

.Protocol は、プロトコルのコンテキストにのみ存在する別のメタタイプです。とはいえ、私たちが欲しいのは P.Type . これは、すべての汎用アルゴリズムがプロトコルのメタタイプで動作することを妨げ、実行時のクラッシュにつながる可能性があります。

もっと好奇心旺盛な人のために

その type(of:) 関数は実際にはコンパイラによって処理されますが、これは不整合な .Protocol が作り出す矛盾のためです。

// This implementation is never used, since calls to `Swift.type(of:)` are
// resolved as a special case by the type checker.
public func type<T, Metatype>(of value: T) -> Metatype { ... }