如何列出Swift中实现给定协议的所有类?
比方说我们有一个例子:
protocol Animal {
func speak()
}
class Cat:Animal {
func speak() {
print("meow")
}
}
class Dog: Animal {
func speak() {
print("Av Av!")
}
}
class Horse: Animal {
func speak() {
print("Hurrrr")
}
}
下面是我当前的(不可编译的)方法:
func getClassesImplementingProtocol(p: Protocol) -> [AnyClass] {
let classes = objc_getClassList()
var ret = [AnyClass]()
for cls in classes {
if class_conformsToProtocol(cls, p) {
ret.append(cls)
}
}
return ret
}
func objc_getClassList() -> [AnyClass] {
let expectedClassCount = objc_getClassList(nil, 0)
let allClasses = UnsafeMutablePointer<AnyClass?>.alloc(Int(expectedClassCount))
let autoreleasingAllClasses = AutoreleasingUnsafeMutablePointer<AnyClass?>(allClasses)
let actualClassCount:Int32 = objc_getClassList(autoreleasingAllClasses, expectedClassCount)
var classes = [AnyClass]()
for i in 0 ..< actualClassCount {
if let currentClass: AnyClass = allClasses[Int(i)] {
classes.append(currentClass)
}
}
allClasses.dealloc(Int(expectedClassCount))
return classes
}
但无论是打电话getClassesImplementingProtocol(Animal.Protocol)
或getClassesImplementingProtocol(Animal)
或getClassesImplementingProtocol(Animal.self)
导致Xcode错误:无法将类型(Animal.Protocol)的值。类型转换为所需的参数类型“Protocol”。
有人把这个修好了吗
2条答案
按热度按时间qxgroojn1#
由于您使用Objective-C运行时来获取类型内省,因此需要以这种方式将
@objc
添加到代码中:请注意,这种类型的内省可能非常慢。
4szc88ey2#
就速度而言,你可以在一个for中完成它,而不必像这样遍历所有类: