2016-10-12 7 views
1

クラスの名前を文字列として指定すると、Swiftクラスのインスタンスを作成できますか?これは、デフォルトの型だけでなく、ユーザー定義を含むすべてのクラスに適用されます。Objective-Cランタイムを使用せずにSwiftでクラスをインスタンス化する方法

わかりましたが、これは純粋なスウィフトでは不可能です。言語は静的に型付けされているので、コンパイル時にすべてのクラス型を知る必要があります。しかし、動的であるObjective-Cランタイムを使用してこれを実行する方法を示すいくつかのソースがあります。

私の解決策はLinux上で実行する必要があり、現在Linux用のSwiftではobjective-cランタイムは利用できません。クラス名を含む文字列が渡された場合、Swiftクラスのインスタンスを返すc/C++関数を記述することは可能ですか?あるいは、言語/コンパイラの設計/構造がこれを禁止していますか?

+0

これは、[XY問題](http://xyproblem.info)の場合が考えられます。何のためにこれをする必要がありますか? – Alexander

+0

私たちの目標は、型情報を含むカスタムオブジェクト表記を解析し、このオブジェクト表記法を使用してSwiftでクラスインスタンスを動的に作成できるようにすることです。 –

+0

私が尋ねることがあるのであれば、既存のオブジェクト直列化技術を使わないのはなぜですか? – Alexander

答えて

0

これは現在、純粋なSwiftでは実行できません。 Swiftは「静的に型指定されている」ためではなく、まだ実装されていないからです。これを行うためにObjective Cランタイム(動的である、はい)を使用する場合は、コンパイラーの静的型情報を提供する必要があります。動的な振る舞いを持つプログラムの部分は非常に限られています。ある意味では、コンパイラの仕事の1つは、明示的キャストを使用して、実行時の動作についてコンパイル時のアサーションを要求することによって、静的型の虹と安全性のバタフライの領域に戻ることを要求することです。

私は間違っているかもしれませんが、私はそこにC/C++の回避策はないと思います。最終的には、ロードされたすべてのクラスについての知識がある種のランタイムシステムが必要です。これは名前で照会できます。 SwiftはObjective Cランタイムに依存しています。

リフレクションはSwiftの目標です。開発チームは、Swift 3に含まれているリフレクションメタデータを増やしたと述べています。スイフトは現在非常に急速に進化しており、Swiftを実装しているチームは、他の目標(条件適合、改良されたジェネリック、ABI安定性、APIガイドライン標準化など)に対して優先順位を低くすることを反映しています。

+0

「静的に型指定されている」ためです。 –

+0

さらに、Qは「クールな開発者はSwiftで作業するの?あるいは「なぜ我々は何年もそれを研究しているのですか? 「プログラミング言語の良い宣伝は何が問題を解決できないのだろうか?」 –

+0

これはどのような対応ですか?それは「静的に型指定された」ためです。 – Alexander

関連する問題