在名为“MyApp”的应用中考虑此代码......
class Foo{
class Laa{
static let laaVar = "I am laaVar"
}
}
我知道我可以获得Laa
的完全限定名称,就像这样......
let laaName = String(reflecting: Foo.Laa.self)
// Returns 'MyApp.Foo.Laa'
但是如何获得laaVar
的完全限定名称(例如“MyApp.Foo.Laa.laaVar”)?
这甚至可能吗?
奖金问题
鉴于上面的代码和包含字符串“MyApp.Foo.Laa.laaVar”的变量,我如何获得值“我是laaVar”?
我猜测两者的答案都与反射/镜像有关。
答案 0 :(得分:0)
我想我找到了一个解决你问题的方法。您可以使用Objective-c运行时,尤其是函数class_copyPropertyList
,它描述了类声明的属性。例如:
import Foundation
class Foo {
class Laa: NSObject {
@objc static let laaName = "I am laaVar"
}
}
var count: CUnsignedInt = 0
let methods = class_copyPropertyList(object_getClass(Foo.Laa.self), &count)!
for i in 0 ..< count {
let selector = property_getName(methods.advanced(by: Int(i)).pointee)
if let key = String(cString: selector, encoding: .utf8) {
let res = Foo.Laa.value(forKey: key)
print("name: \(key), value: \(res ?? "")")
}
}
结果是:
name:laaName,value:我是laaVar