Помогите разобраться. Все работает за исключением того, что тип свойства класса выходит всегда пустым. Также в данном примере мы сначала получаем все классы в приложении и их все перебираем, когда ищем наследуемые от определенного класса. Нет ли более “быстрого” способа?
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 })