Как проверить класс экземпляра, который соответствует протоколу в swift? - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь проверить класс экземпляра, который соответствует протоколу.

У меня есть протокол.

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 голосов
/ 04 июля 2018

Я думаю, вам нужно попытаться разыграть его, как

if let vc = toolbar as? GameToolbar {}

В вашем случае вам может понадобиться что-то вроде этого:

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