如何在Swift中列出所有符合协议的类?

mixtly87

如何列出在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")
  }
}

请注意,这种类型的自省可能非常慢。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在 Swift 中使类符合协议并且可以覆盖协议方法?

来自分类Dev

如何列出对象符合的协议?

来自分类Dev

如何让 Swift 中的类扩展一个具体的类并符合多个协议?

来自分类Dev

iOS Swift类符合协议

来自分类Dev

Swift中所有数字都符合什么协议?

来自分类Dev

swift方法中的参数“符合协议的类的类型”

来自分类Dev

swift方法中的参数“符合协议的类的类型”

来自分类Dev

如何快速使类符合协议?

来自分类Dev

如何使所有子类都必须符合协议?

来自分类Dev

使Swift类符合协议-在静态/类级别

来自分类Dev

如何在Swift中从带有类型别名的协议中引用具有约束的泛型类?

来自分类Dev

iOS11 Swift 4 - 如何检查 Swift 类是否符合 Objective-C 中定义的协议?

来自分类Dev

如何在Powershell中列出目录中的所有项目

来自分类Dev

如何在Swift中具有泛型的扩展中使用带有可选类方法的协议?

来自分类Dev

Swift中的协议扩展,其中对象是一个类并符合协议

来自分类Dev

符合Objective-C协议的Swift类

来自分类Dev

符合协议和类的Swift属性

来自分类Dev

扩展Foundation类以符合Swift协议

来自分类Dev

Swift 类不符合 Enum 协议

来自分类Dev

如何在bash中列出所有背景pid

来自分类Dev

如何在GC完成列表中列出所有对象?

来自分类Dev

如何在git中列出所有文件?

来自分类Dev

如何在UIWebView中列出所有请求?

来自分类Dev

如何在hasura中列出所有创建的权限?

来自分类Dev

如何在discord.py中列出所有角色

来自分类Dev

如何在AWS RedShift中列出所有存储过程

来自分类Dev

如何在“信任平台”中列出所有产品?

来自分类Dev

如何在跨架构的Postgres中列出所有表

来自分类Dev

如何在终端中列出所有文件名?

Related 相关文章

  1. 1

    如何在 Swift 中使类符合协议并且可以覆盖协议方法?

  2. 2

    如何列出对象符合的协议?

  3. 3

    如何让 Swift 中的类扩展一个具体的类并符合多个协议?

  4. 4

    iOS Swift类符合协议

  5. 5

    Swift中所有数字都符合什么协议?

  6. 6

    swift方法中的参数“符合协议的类的类型”

  7. 7

    swift方法中的参数“符合协议的类的类型”

  8. 8

    如何快速使类符合协议?

  9. 9

    如何使所有子类都必须符合协议?

  10. 10

    使Swift类符合协议-在静态/类级别

  11. 11

    如何在Swift中从带有类型别名的协议中引用具有约束的泛型类?

  12. 12

    iOS11 Swift 4 - 如何检查 Swift 类是否符合 Objective-C 中定义的协议?

  13. 13

    如何在Powershell中列出目录中的所有项目

  14. 14

    如何在Swift中具有泛型的扩展中使用带有可选类方法的协议?

  15. 15

    Swift中的协议扩展,其中对象是一个类并符合协议

  16. 16

    符合Objective-C协议的Swift类

  17. 17

    符合协议和类的Swift属性

  18. 18

    扩展Foundation类以符合Swift协议

  19. 19

    Swift 类不符合 Enum 协议

  20. 20

    如何在bash中列出所有背景pid

  21. 21

    如何在GC完成列表中列出所有对象?

  22. 22

    如何在git中列出所有文件?

  23. 23

    如何在UIWebView中列出所有请求?

  24. 24

    如何在hasura中列出所有创建的权限?

  25. 25

    如何在discord.py中列出所有角色

  26. 26

    如何在AWS RedShift中列出所有存储过程

  27. 27

    如何在“信任平台”中列出所有产品?

  28. 28

    如何在跨架构的Postgres中列出所有表

  29. 29

    如何在终端中列出所有文件名?

热门标签

归档