列出一个类的所有子类 [英] List all subclasses of one class

查看:55
本文介绍了列出一个类的所有子类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我可以返回一个类的所有子类的列表吗?例如:

Can I return a list of all subclasses of one class? For example:

class Mother {

}

class ChildFoo: Mother {

}

class ChildBar: Mother {

}

let motherSubclasses = ... // TODO
print(motherSubclasses) // should to return [ChildFoo.self, ChildBar.self]

推荐答案

令人惊讶的是,Objective-C 运行时函数与 Swift 类的工作效果一样好,即使它们没有从 NSObject 子类化.此外,Swift 中的所有类似乎都源自 SwiftObject.SwiftObject 本身没有超类.

Surprisingly the Objective-C runtime functions work just as well with Swift classes, even if they don't subclass from NSObject. Further, all classes in Swift seems to derive from SwiftObject. SwiftObject itself does not have a superclass.

首先,一个处理 ObjC 运行时函数的包装结构:

First, a wrapper structure to handle the ObjC runtime functions:

import Foundation

struct ClassInfo : CustomStringConvertible, Equatable {
    let classObject: AnyClass
    let className: String

    init?(_ classObject: AnyClass?) {
        guard classObject != nil else { return nil }

        self.classObject = classObject!

        let cName = class_getName(classObject)!
        self.className = String(cString: cName)
    }

    var superclassInfo: ClassInfo? {
        let superclassObject: AnyClass? = class_getSuperclass(self.classObject)
        return ClassInfo(superclassObject)
    }

    var description: String {
        return self.className
    }

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

以下是您可以使用它的方法:

Here's how you can use it:

class Mother { }
class ChildFoo: Mother { }
class ChildBar: Mother { }

class AnIrrelevantClass { }

let motherClassInfo = ClassInfo(Mother.self)!
var subclassList = [ClassInfo]()

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

for i in 0..<Int(count) {
    if let classInfo = ClassInfo(classList[i]),
        let superclassInfo = classInfo.superclassInfo,
        superclassInfo == motherClassInfo
    {
        subclassList.append(classInfo)
    }
}

print(subclassList)

这只会执行浅层搜索,因此它不会清除孙子类,但您明白了.

This only performs a shallow search so it won't sweep up grandchildren classes but you get the idea.

这篇关于列出一个类的所有子类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆