【发布时间】:2016-10-12 22:22:31
【问题描述】:
在我的反射库EVReflection 中,当嵌套类定义(类中的类)时,我遇到了以下问题。下面是一个已解决的案例,可以作为单元测试找到here,库本身中代码需要更改的位置是Here
我需要获取嵌套的内部 Swift 字符串表示 属性的类,该属性是该嵌套类的数组。
您可以在下面看到一个单元测试,在该测试中我能够为作为另一个对象的房地产公司获取正确的类型。它将输出_TtCC22EVReflection_iOS_Tests13TestIssue114b10Company114 而不是Company114
当我对 friends 属性尝试相同的操作时,我的目标是它输出如下内容:Swift.Array<_TtCC22EVReflection_iOS_Tests13TestIssue114b7User114>
我该怎么做才能得到它?
正如您在测试中看到的,我对值 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 为它创建一个实例。
【问题讨论】:
-
String(reflecting: type(of: theValue)) -
@Jiri 哇!这样可行!你能把回复改成答案吗?那我可以给你250赏金!
标签: swift reflection typeof mirror