如何快速检查符合协议的实例的类?

时间:2018-07-04 08:27:24

标签: swift swift4 swift-protocols

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

我有一个协议。

protocol ToolbarProtocol {

  func show()

  func hide()

}

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

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
    })
  }

我无法在isKind(of)上调用toolbar,这在以前我的工具栏是外部库提供的另一种类时起作用(我试图从我的代码库中删除该类,想要不同的功能)。

我尝试使协议扩展AnyObject,但是我认为这是隐式的,并且没有任何作用。

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

1 个答案:

答案 0 :(得分:2)

我认为您将需要像

那样进行投射
if let vc = toolbar as? GameToolbar {}

在您的情况下,您可能需要以下内容:

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