如何在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错误:无法将types(Animal.Protocol).Type的值转换为期望的参数types“Protocol”。

有没有人pipe理得到这个工作?

由于您使用Objective-C运行时来获取types自省,因此您需要以这种方式将@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") } } 

请注意,这种types的内省可能会非常缓慢。