如何获取嵌套类的字符串表示

Edw*_*eer 1 reflection typeof mirror swift

在我的反射库EVReflection中,当类定义嵌套(类中的类)时,我遇到以下问题。下面是一个已解决的案例,可以在此处作为单元测试找到,库本身中需要更改代码的位置是此处

我需要为一个属性获取嵌套类的内部 Swift 字符串表示,该属性是该嵌套类的数组。

您可以在下面看到一个单元测试,其中我能够为作为其他对象的财产公司获取正确的类型。它会输出_TtCC22EVReflection_iOS_Tests13TestIssue114b10Company114而不是Company114

当我对friends 属性尝试同样的操作时,我的目标是输出如下内容:Swift.Array<_TtCC22EVReflection_iOS_Tests13TestIssue114b7User114> 我需要做什么才能得到它?

正如您在测试中看到的,我对 valueType 值进行了各种分配。这些任务都不起作用。我只能得到 anArray<User114>或 an 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
    }
}
Run Code Online (Sandbox Code Playgroud)

背景信息: 实际上,最终目标是我必须能够创建可以添加到数组中的对象实例。由于数组属性仅作为 Mirror 命令的结果可用,因此变量的类型为 Any。我确实有一个数组扩展,它将返回一个新的数组元素。但是我只能在 Any 被强制转换时得到它Array<NSObject>,因此我的扩展将返回一个 NSObject。所以我想得到一个字符串,就像Swift.Array<_TtCC22EVReflection_iOS_Tests13TestIssue114b7User114>我可以得到 <> 之间的部分,然后使用 NSClassFromString 为它创建一个实例。

Jir*_*iri 6

String(reflecting: type(of: theValue))

Edwin Vermeer 更新: 对于到内部字符串表示所需的转换,我现在有以下功能(仍在草案中)

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
}
Run Code Online (Sandbox Code Playgroud)