在Swift中,如何获得变量的完全限定名称?

时间:2017-12-13 00:59:32

标签: swift reflection types mirror

在名为“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”?

我猜测两者的答案都与反射/镜像有关。

1 个答案:

答案 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