1. ホーム
  2. introspection

[解決済み] Swiftのクラスイントロスペクションとジェネリックス

2022-08-13 14:11:35

質問

を動的に作成しようとしています。 class インスタンスベースの型をジェネリックスを使用して作成しようとしていますが、クラスのイントロスペクションで困難に遭遇しています。

以下は質問です。

  • Obj-CのSwiftに相当するものはありますか? self.class ?
  • を使用してクラスをインスタンス化する方法はありますか? AnyClass の結果を NSClassFromString ?
  • を取得する方法はありますか? AnyClass などの型情報を、一般的なパラメータである T ? (C#の typeof(T) の構文に似ています)

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

まあ、1つは、Swiftに相当する [NSString class].self (である(参照 メタタイプのドキュメント を参照してください。)

実際には NSString.class は機能しません。そのため NSString.self .

let s = NSString.self
var str = s()
str = "asdf"

同様に、swiftのクラスで試してみると...。

class MyClass {

}

let MyClassRef = MyClass.self

// ERROR :(
let my_obj = MyClassRef()

うーん・・・エラーになってる

プレイグラウンドの実行に失敗しました: error: :16:1: error: constructing an object of class type 'X' with a metatype value requires an '@required' initializer

 Y().me()
 ^
 <REPL>:3:7: note: selected implicit initializer with type '()'
 class X {
       ^

この意味を理解するのに時間がかかりました...結局、クラスが @required init()

class X {
    func me() {
        println("asdf")
    }

    required init () {

    }
}

let Y = X.self

// prints "asdf"
Y().me()

いくつかのドキュメントでは、これを .Type と表記しているものもありますが MyClass.Type はプレイグラウンドでエラーを出します。