swift – 列出一个类的所有子类

前端之家收集整理的这篇文章主要介绍了swift – 列出一个类的所有子类前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我可以返回一个类的所有子类的列表吗?例如:
  1. class Mother {
  2.  
  3. }
  4.  
  5. class ChildFoo: Mother {
  6.  
  7. }
  8.  
  9. class ChildBar: Mother {
  10.  
  11. }
  12.  
  13. let motherSubclasses = ... // TODO
  14. print(motherSubclasses) // should to return [ChildFoo.self,ChildBar.self]
令人惊讶的是,Objective-C运行时函数与Swift类一样工作,即使它们不是NSObject的子类.此外,Swift中的所有类似乎都是从SwiftObject派生的. SwiftObject本身没有超类.

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

  1. import Foundation
  2.  
  3. struct ClassInfo : CustomStringConvertible,Equatable {
  4. let classObject: AnyClass
  5. let className: String
  6.  
  7. init?(_ classObject: AnyClass?) {
  8. guard classObject != nil else { return nil }
  9.  
  10. self.classObject = classObject!
  11.  
  12. let cName = class_getName(classObject)!
  13. self.className = String(cString: cName)
  14. }
  15.  
  16. var superclassInfo: ClassInfo? {
  17. let superclassObject: AnyClass? = class_getSuperclass(self.classObject)
  18. return ClassInfo(superclassObject)
  19. }
  20.  
  21. var description: String {
  22. return self.className
  23. }
  24.  
  25. static func ==(lhs: ClassInfo,rhs: ClassInfo) -> Bool {
  26. return lhs.className == rhs.className
  27. }
  28. }

以下是如何使用它:

  1. class Mother { }
  2. class ChildFoo: Mother { }
  3. class ChildBar: Mother { }
  4.  
  5. class AnIrrelevantClass { }
  6.  
  7. let motherClassInfo = ClassInfo(Mother.self)!
  8. var subclassList = [ClassInfo]()
  9.  
  10. var count = UInt32(0)
  11. let classList = objc_copyClassList(&count)!
  12.  
  13. for i in 0..<Int(count) {
  14. if let classInfo = ClassInfo(classList[i]),let superclassInfo = classInfo.superclassInfo,superclassInfo == motherClassInfo
  15. {
  16. subclassList.append(classInfo)
  17. }
  18. }
  19.  
  20. print(subclassList)

这只会进行浅层搜索,因此它不会扫除孙子类,但你明白了.

猜你在找的Swift相关文章