Доступ к статическим переменным класса модели с использованием отражения

У меня есть класс модели, который содержит некоторые статические переменные и свойства. Во время выполнения я могу получить свойства;

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

person Mustafa Sait Demirci    schedule 09.02.2016    source источник


Ответы (2)


Получение свойств типа через отражение пока не поддерживается. Вы можете увидеть это, проверив displayStyle из Mirror, которые вы получите, если передадите объект класса инициализатору:

let mirror = Mirror(reflecting: ActionModel.self)
print(mirror.displayStyle)    // nil
person Alberto Doda    schedule 10.02.2016

Вы можете использовать среду выполнения 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 ?? "")")
    }
}
person Andrea Mugnaini    schedule 21.02.2018