如何在Swift中列出所有符合协议的类?
如何列出在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的值转换为预期的参数类型’Protocol’。
有人设法使这个工作正常吗?
回答:
由于您使用的是Objective-C运行时来获取类型自省,因此需要以@objc
这种方式添加到代码中:
@objc protocol Animal { func speak()
}
class Cat:Animal {
@objc func speak() {
print("meow")
}
}
class Dog: Animal {
@objc func speak() {
print("Av Av!")
}
}
class Horse: Animal {
@objc func speak() {
print("Hurrrr")
}
}
请注意,这种类型的自省可能非常慢。
以上是 如何在Swift中列出所有符合协议的类? 的全部内容, 来源链接: utcz.com/qa/404852.html