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 { }
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)
let start = CFAbsoluteTimeGetCurrent()
let found = RuntimeUtils.subclasses(of:UIViewController.self)
let diff = CFAbsoluteTimeGetCurrent() - start
print("Took \(diff) seconds, \(found.count) found")
型 产出: 字符串(描述:theClass):Took 1.0465459823608398 seconds, 174 found 地址(of:theClass):Took 0.2642860412597656 seconds, 174 found
4条答案
按热度按时间pxy2qtax1#
令人惊讶的是,即使Swift类不是
NSObject
的子类,Swift中的所有类似乎都是从SwiftObject
派生的。SwiftObject
本身没有超类。首先,处理ObjC运行时函数的 Package 器结构:
字符串
以下是您可以如何使用它:
型
这只执行一个浅层搜索,所以它不会清理孙子类,但你明白的想法。
uwopmtnx2#
Jean Le Moignan代码的优化版本
个字符
对于每个Type,在运行时只有一个元类示例,因此,它们上的指针是唯一的。出于某种原因,操作符
===
不允许用于AnyClass,但我们可以直接比较指针性能测试:
型
产出:
字符串(描述:theClass):
Took 1.0465459823608398 seconds, 174 found
地址(of:theClass):
Took 0.2642860412597656 seconds, 174 found
svmlkihl3#
以下是基于Code Different之前的答案的变体,但更短:
字符串
返回类型将根据接收变量的类型,这要归功于泛型。
我想把它作为AnyClass的一个扩展来写,但不幸的是Swift不允许。
sxissh064#
objc_copyClassList返回的结果不再是可验证的。这是有效的:
字符串