Сосчитать наследуемые классы и вывести свойства (имя, тип)


#1

Помогите разобраться. Все работает за исключением того, что тип свойства класса выходит всегда пустым. Также в данном примере мы сначала получаем все классы в приложении и их все перебираем, когда ищем наследуемые от определенного класса. Нет ли более “быстрого” способа?

struct classInfo: CustomStringConvertible, Equatable {
    let object: AnyClass
    let name: String
    
    init?(_ object: AnyClass!) {
        guard object != nil else { return nil }
        
        self.object = object
        self.name = String(cString: class_getName(object))
    }
    
    var superClassInfo: classInfo? {
        let superClassObject: AnyClass? = class_getSuperclass(self.object)
        return classInfo(superClassObject)
    }
    
    var description: String {
        return self.name.components(separatedBy: ".").last!
    }
    
    var properties: [String: String] {
        var properties = [String: String]()
        var ivarCount: UInt32 = 0
        let ivars: UnsafeMutablePointer<Ivar> = class_copyIvarList(self.object, &ivarCount)!
        
        for i in 0 ..< Int(ivarCount) {
            guard let name = String(cString: ivar_getName(ivars[i])!, encoding: .utf8), let type = String(cString: ivar_getTypeEncoding(ivars[i])!, encoding: .utf8) else { continue }
            properties[name] = type
        }
        
        return properties
    }

    static func ==(lhs: classInfo, rhs: classInfo) -> Bool {
        return lhs.name == rhs.name
    }
}

let superClassInfo = classInfo(mySuperClass.self)!
var inheritedClassList = [classInfo]()

var count: UInt32 = 0
let classList = objc_copyClassList(&count)!

for i in 0 ..< Int(count) {
    if let classInfo = classInfo(classList[i]), let superInfo = classInfo.superClassInfo, superInfo == superClassInfo {
        inheritedClassList.append(classInfo)
    }
}

print(inheritedClassList)
print(inheritedClassList.map { $0.properties })