【发布时间】:2023-03-03 07:02:24
【问题描述】:
如何列出所有在 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).Type 的值转换为预期的参数类型“协议”。
有人设法让这个工作正常吗?
【问题讨论】:
-
错误出现在哪一行?
-
我认为这可能对你有帮助:stackoverflow.com/questions/28124684/…
标签: ios swift reflection swift2