swift - 如何快速检查符合协议(protocol)的实例类?

标签 swift swift4 swift-protocols

我正在尝试检查符合协议(protocol)的实例类。

我有一个协议(protocol)。

protocol ToolbarProtocol {

  func show()

  func hide()

}

我有一个符合该协议(protocol)的类。

class GameToolbar: ToolbarProtocol {
...
}

我创建了一个管理器类来管理我的工具栏。

class ToolbarManager {
  var existingToolbars: [Game.rotation: Array<ToolbarProtocol>]
}

在这个管理器中,我有一个函数想要找到特定类型工具栏的第一个实例。

func getDebugToolbar() -> ToolbarProtocol? {
    return existingToolbars[.east]?.first(where: { (toolbar: ToolbarProtocol) -> Bool in
      toolbar.isKind(of: GameToolbar.self) //This line causes an error because .isKind is not a member of ToolbarProtocol
    })
  }

我无法在 toolbar 上调用 isKind(of),以前当我的工具栏是由外部库(我我试图从我的代码库中删除,因为我想要不同的功能)。

我尝试让我的协议(protocol)扩展 AnyObject,但我认为这无论如何都是隐含的,并且没有效果。

如何检查符合给定协议(protocol)的实例数组,以检查特定的类类型?

最佳答案

我认为你需要尝试转换它,比如

if let vc = toolbar as? GameToolbar {}

在您的情况下,您可能需要这样的东西:

func getDebugToolbar() -> ToolbarProtocol? {
    return existingToolbars[.east]?.first(where: { (toolbar: ToolbarProtocol) -> Bool in
      let _ = toolbar as? GameToolbar
    })
  }

关于swift - 如何快速检查符合协议(protocol)的实例类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51169114/

相关文章:

swift - 如何使用 Kingfisher 在 map 注释 View 上设置图像?

Swift 崩溃从地址簿中提取记录值

具有递归枚举的 Swift Codable 协议(protocol)

ios - 如何在 swift 4 中更改 NavBar 标题文本颜色?

swift - `#selector` 的参数未引用初始化程序或方法

swift - 面向协议(protocol)编程扩展变量初始化两次

swift - 如何在 Swift iOS8 中调整或自定义 IBOutlet 按钮的形状作为内部按钮的图像

ios - DispatchQueue.main.asyncAfter 带开/关开关

ios - 如何在alert.addTextfield中放置$硬币掩码?

swift - UIScrollView Delegate 作为协议(protocol)默认实现