Swift 2.0でタイプ情報を分析しようとしていますが、それを静的構造に保存しようとしていますが、スタックしています。 最も有望なアプローチは、インスタンスに対してミラーを作成することです。これは、オンデマンドで一度だけ実行されます。デフォルトのinitを仮定し、ミラー要素のsubjectTypeを調べます。Swift 2.0タイプ解析のためのリフレクション
私の質問は以下のとおりです。
- オプションの種類(例えば
Optional<String>
)をアンラップする方法。タイプとしてString
の部分を持っています。 - 一般的な配列の型を決定する方法。
Array<Foo>
。
文字列を解析することは愚かであり、それはおそらく不可能です...配列に関連
その他の質問:要素の型を持っている場合は、どのように私は、新しいインスタンスを作成するのですか?
明確にする。タイプセーフであることを試みる関与するオブジェクトのタイプに関する情報を必要とする、または必要に応じて適切な変換を挿入する、マッパー(オブジェクトマッパー、jsonマッパー、ウィジェットマッパーなど)などのより高度なアルゴリズムのタイプ情報が必要です。
例外を発生させるべきでないInt?
プロパティにマップする必要があるプロパティーInt
を考えます。
コードは、これまでにすべての必要な情報を格納する必要がありPropertyDescriptor
年代の配列が含まBeanDescriptor
クラスを埋め
何かのように:
class PropertyDescriptor {
// instance data
var bean: BeanDescriptor;
var name: String;
var type: Any.Type;
var optional = false
// more data for arrays, e.g. elementType...
...
}
コードは、これまでのクラスを分析することである。
// create a default instance
let instance = create(); // we need a NSObject though! darn...
let mirror = Mirror(reflecting: instance)
if let displayStyle = mirror.displayStyle {
if displayStyle == .Class {
for case let (label?, value) in mirror.children {
let property = analyzeProperty(label, value: value)
properties[property.name] = property;
} // for
}
}
と呼ばれる機能
func analyzeProperty(name : String, value: Any) -> PropertyDescriptor {
let mirror : Mirror = Mirror(reflecting: value)
var type = mirror.subjectType
var optional = false
// no way..this sucks!
if (type == String?.self) {
type = String.self // uhhhh
optional = true
}
else if ... // lots other literal types, ...
return PropertyDescriptor(bean: self, name: name, type: type, optional: optional)
}
しかし、これは他の任意のクラスMoney?
、および配列に関する他の情報をカバーしない。例えばArray<Money>
、または私は配列型を検出するであろうし、ジェネリックアレイタイプを決定するためにどのように要素型
をあなたが欲しいものを理解するのに苦労しています。あなたはいくつかのコードを投稿できると思いますか?あなたが持っているもの、欲しいもの、考えていることを示す擬似コードを示す何か? – solidcell
質問を編集しました:-) –