Swift - メタタイプ.Typeと.selfの違いは何ですか?
質問
メタタイプの違いは何ですか?
.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 { ... }
関連
-
[解決済み] Swiftのstatic funcとclass funcの違いは何ですか?
-
[解決済み] Swift言語におけるエクスクラメーションマークの意味とは?
-
[解決済み] Swift Betaのパフォーマンス:配列のソート
-
[解決済み] Swift: print() vs println() vs NSLog()
-
[解決済み] Swiftを使用してアプリのバージョンとビルド番号を取得するにはどうすればよいですか?
-
[解決済み】Swiftでオブジェクトが与えられた型かどうかを確認する
-
[解決済み】(Swiftで)オブジェクトの型を調べるには?)
-
[解決済み】Swiftの`let`と`var`の違いは何ですか?
-
[解決済み] カスタムイニシャライザを持つSwift enumはrawValueイニシャライザを失う
-
[解決済み] Swiftの数学関数
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Swift Error fatal error: Optional value のアンラップ中に予期せず nil を発見した。
-
[解決済み] 引数とパラメータの違いは何ですか?
-
[解決済み] Swiftのクラスにおける静的関数/変数とクラス関数/変数?
-
[解決済み】swift言語におけるstructureとclassの比較
-
[解決済み] Swiftで範囲を作成する方法は?
-
[解決済み] 固定サイズのオブジェクトの配列を作成する方法
-
[解決済み] Swiftでenumの関連値を無視して比較する方法は?
-
[解決済み] Objective-CフレームワークをSwiftプロジェクトにインポートする際、Bridging Headerで「ファイルが見つかりません」と表示される。
-
[解決済み] SwiftUI のテキストのフォントサイズをカスタマイズする
-
[解決済み] Swiftのコード実行をベンチマークするには?