Технически вы можете заставить это работать.Пожалуйста, не надо.Это ужасный Свифт.Чтобы заставить это работать, вы должны подорвать все, что Swift пытается сделать.Но да, с предупреждениями, вы можете технически заставить это скомпилировать и работать.Пожалуйста, не надо.
Во-первых, вам нужно сделать selector
Selector
.Вы используете NSDictionary
, что ужасно в Swift, и вы получаете Any?
обратно.Но, да, вы можете as!
привести его к тому, что вы хотите:
let selector = controllerClass.configurations().object(forKey: selectorKey) as! Selector
И затем, бросая вызов всем богам типов, вы можете просто объявить, что классы на самом деле NSObjectProtocol
, потому что почему бы и нет?
(controllerClass as! NSObjectProtocol).perform(selector)
Это выдаст предупреждение «Приведение из« MapCoordinatorViewController.Type »к несвязанному типу« NSObjectProtocol »всегда завершается неудачей», но на самом деле это будет успешным.
После всего этого «donне делай этого, "как вы должны это сделать?С крышками.
public protocol MazeProtocol {
static var configurations: [String: () -> Void] { get }
}
class MapCoordinatorViewController: UIViewController {}
extension MapCoordinatorViewController: MazeProtocol {
static let configurations: [String: () -> Void] = [
"test": test
]
static func test() {
print("test")
}
}
let controllerClass = MapCoordinatorViewController.self
let method = controllerClass.configurations["test"]!
method()