2016-10-12 5 views
1

私のリフレクションライブラリ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を使用してそのインスタンスを作成します。

+0

'文字列(反射を有しますof:theValue)) ' – Jiri

+0

@ジリワウ!それは動作します!回答を回答に変更できますか?それから私はあなたに250の賞金ポイントを与えることができます! –

+0

完了、ありがとうございます! – Jiri

答えて

3

String(reflecting: type(of: theValue))

エドウィン・フェルメールによる更新:タイプ(内部文字列表現するために必要な変換について 私は今、(まだドラフトで)次の関数

public class func convertToInternalSwiftRepresentation(type: String) -> String { 
    if type.components(separatedBy: "<").count > 1 { 
     // Remove the Array or Set prefix 
     let prefix = type.components(separatedBy: "<") [0] + "<" 
     var subtype = type.substring(from: prefix.endIndex) 
     subtype = subtype.substring(to: subtype.characters.index(before: subtype.endIndex)) 
     return prefix + convertToInternalSwiftRepresentation(type: subtype) + ">" 
    } 

    if type.contains(".") { 
     var parts = type.components(separatedBy: ".") 
     if parts.count == 2 { 
      return parts[1] 
     } 
     let c = String(repeating:"C", count: parts.count - 1) 
     var rv = "_Tt\(c)\(parts[0].characters.count)\(parts[0])" 
     parts.remove(at: 0) 
     for part in parts { 
      rv = "\(rv)\(part.characters.count)\(part)" 
     } 
     return rv 
    } 
    return type 
} 
+0

それはEVReflection_iOS_Tests.TestIssue114b.User114を返すので、私はまだ_TtCC22EVReflection_iOS_Tests13TestIssue114b7User114にキャストする必要がありますが、それは厳しい順変換です。この返答をありがとう! –

+0

残念ですが、私はそのメソッドの最後のコメントで指定された 'testIssueNestedObjects(_ :)'から正しい出力を達成しようとしていました。 – Jiri

+0

それは完璧です、あなたは多くの助けになりました!これは私のために十分です。 –

関連する問題