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

3
考虑在名为 "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"的变量,如何获取值"I am laaVar"?

我猜两个问题的答案都与反射/镜像有关。

1个回答

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 ?? "")")
    }
}

结果是:

名称:laaName,值:我是laaVar


有趣!在接受之前,让我先试着玩弄一下它。顺便说一句,我已经更正了我的代码,并相应地更新了你的答案。这只是一个命名更改。 - Mark A. Donohoe
不过,我有一个快速的问题... 你为什么要使用 Int(i) 而不是只用 i 呢?难道在 for 循环中它不已经被隐式地声明为 Int 类型了吗? - Mark A. Donohoe
1
@MarqueIV 我不得不进行这样的Int转换,因为出现了以下错误:error: cannot convert value of type 'CUnsignedInt' (aka 'UInt32') to expected argument type 'Int' - mugx
哈!我不知道它将隐式循环变量视为UInt32!有趣! - Mark A. Donohoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接