私のリフレクションライブラリEVReflectionクラス定義がネストされている(クラス内のクラス)とき、次の問題があります。以下のコードを変更する必要があるライブラリ自体にユニットテストhereと場所として求めることができる働いた場合は、私は、ネストされた クラスの内部スウィフトの文字列表現を取得する必要がありますHere入れ子クラスの文字列表現を取得する方法
されていますそのネストされたクラスの配列であるプロパティのために。
ここでは、私が他のオブジェクトである不動産会社の正しいタイプを取得できるユニットテストを見ることができます。私はそれを取得するために行う必要がありますどのようなSwift.Array<_TtCC22EVReflection_iOS_Tests13TestIssue114b7User114>
:それは、私は友人のプロパティのために同じことをしようとすると、私の目標は、それはのようなものを出力していることである代わりにCompany114
の出力_TtCC22EVReflection_iOS_Tests13TestIssue114b10Company114
だろうか?
テストでわかるように、valueType値にはさまざまな割り当てがあります。これらの割り当ては機能しません。私はArray<User114>
またはSwift._EmptyArrayStorage
しか入手できません。
テストでもわかるように、私がブレークポイントを設定し、出力ウィンドウでpoを実行すると正しい出力を得ることができます。だから私のコードでどのようなコードが同じようになるのだろうか?
class TestIssue114b: XCTestCase {
class User114: EVObject {
var company: Company114 = Company114()
var friends: [User114] = []
}
class Company114: EVObject {
var name: String = ""
var address: String?
}
func testIssueNestedObjects() {
let x = User114()
print("type 1 = \(NSStringFromClass(type(of: x.company)))") // output = type 2 = _TtCC22EVReflection_iOS_Tests13TestIssue114b10Company114
print("type 2 = \(testIssueNestedObjects(x.friends))")
}
func testIssueNestedObjects(_ theValue: Any) -> String {
var valueType = ""
let mi = Mirror(reflecting: theValue)
valueType = NSStringFromClass(type(of: (theValue as! [NSObject]).getTypeInstance() as NSObject)) // NSObject
valueType = "\(type(of: theValue))" // Array<User114>
valueType = "\(mi.subjectType)" // Array<User114>
valueType = ObjectIdentifier(mi.subjectType).debugDescription //"ObjectIdentifier(0x0000000118b4a0d8)"
valueType = (theValue as AnyObject).debugDescription // <Swift._EmptyArrayStorage 0x10d860b50>
valueType = NSStringFromClass(type(of: theValue as AnyObject)) // Swift._EmptyArrayStorage
// set breakpont en enter this in output window: (lldb) po type(of: theValue)
// Ouput will be: Swift.Array<EVReflection_iOS_Tests.TestIssue114b.User114>
return valueType
}
}
背景情報: 実際に最終的な目標は、私は、配列に追加できるオブジェクトのインスタンスを作成できるようにするということです。配列プロパティはMirrorコマンドの結果としてのみ利用可能であるため、変数はAny型になります。私は新しい配列要素を返す配列の拡張を持っています。 AnyがArray<NSObject>
にキャストされているために、私の拡張がNSObjectを返すだけなので、私はそれを得ることができます。だから、Swift.Array<_TtCC22EVReflection_iOS_Tests13TestIssue114b7User114>
のような文字列を取得したいのですが、次に<の間の部分を取得し、NSClassFromStringを使用してそのインスタンスを作成します。
'文字列(反射を有しますof:theValue)) ' – Jiri
@ジリワウ!それは動作します!回答を回答に変更できますか?それから私はあなたに250の賞金ポイントを与えることができます! –
完了、ありがとうございます! – Jiri