我可以返回一個類的所有子類的列表嗎?例如:列出一個類的所有子類
class Mother {
}
class ChildFoo: Mother {
}
class ChildBar: Mother {
}
let motherSubclasses = ... // TODO
print(motherSubclasses) // should to return [ChildFoo.self, ChildBar.self]
我可以返回一個類的所有子類的列表嗎?例如:列出一個類的所有子類
class Mother {
}
class ChildFoo: Mother {
}
class ChildBar: Mother {
}
let motherSubclasses = ... // TODO
print(motherSubclasses) // should to return [ChildFoo.self, ChildBar.self]
令人驚訝的是Objective-C的運行時函數只是工作以及與斯威夫特班,即使他們不從NSObject
子類。此外,Swift中的所有類似於從SwiftObject
派生。 SwiftObject
本身沒有超類。
首先,包裝結構來處理ObjC運行系統功能:
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
}
}
這裏是你如何使用它:
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)
這隻能執行淺層搜索,所以它不會打掃孫子班,但你明白了。
我不相信如果不深入研究Obj-C運行時,這將是可能的 - [這個Q&A](http://stackoverflow.com/questions/7923586/objective-c-get-list-of-subclasses-從超類)可能會是一個很好的起點。雖然我會質疑*爲什麼*你確實想要這樣做? – Hamish