使用反射访问模型类的静态变量

13

我有一个模型类,其中包含一些静态变量和属性。在运行时,我可以获取这些属性。

let instance = entity.init()

let mirror = Mirror(reflecting:instance)

var propertyStrings = [String]()

for (propertyName, childMirror) in mirror.children {

}

但我也想将类的静态变量作为列表获取。那么我该如何获得静态变量名和值的列表?以下是我的模型类结构:

但我也想将类的静态变量作为列表获取。那么我该如何获得静态变量名和值的列表?以下是我的模型类结构:

class ActionModel: NSObject {

static let kLastModified = "LastModified"
static let kEntityName = "EntityName"
static let kIdentifier = "Id"


var lastModified: Int64
var entityName: String?
var identifier : PrimaryKeyString
2个回答

18

目前还不支持通过反射获取类型属性。如果您将类对象传递给初始化器,则可以通过检查所获得的 MirrordisplayStyle 来了解此情况:

let mirror = Mirror(reflecting: ActionModel.self)
print(mirror.displayStyle)    // nil

这似乎七年后仍然没有改变? - Sören Kuklau

9
您可能会使用Objective-c运行时,特别是 class_copyPropertyList 函数,该函数描述了一个类声明的属性。例如:
import Foundation

class Foo:NSObject {
    @objc static var prop1: String? = "Hello I am prop1!"
    @objc static var prop2: String? = "Hello I am prop2!"
}

var count: CUnsignedInt = 0
let methods = class_copyPropertyList(object_getClass(Foo.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.value(forKey: key)
        print("name: \(key), value: \(res ?? "")")
    }
}

1
非常好的答案!省了我很多时间。 - Oz Shabat

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