Протокол Swift для возврата словаря селектора - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь создать протокол, в котором один из методов возвращает словарь селектора.Но я столкнулся с проблемой ...

вот код протокола:

@objc public protocol MazeProtocol: AnyObject {
    @objc static func configurations() -> [String:Selector]
}

и вот ошибка компилятора, которую я получаю: MazeTableViewController.swift:12:24: Method cannot be marked @objc because its result type cannot be represented in Objective-C

Если я удаляю @objc перед методом, я получаю похожую ошибку.

Ответы [ 3 ]

0 голосов
/ 23 ноября 2018

Поскольку вы не можете использовать Selector в Objective C Dictionary напрямую, вы можете изменить словарь и тип значения вашего Swift на String, как показано ниже.

@objc public protocol MazeProtocol: AnyObject {
    @objc static func configurations() -> [String:String]
}

Поэтому, когда вы хотитечтобы получить Selector из словаря configurations, получите его, как показано ниже.

let selectorString = configurations()["KeyToSelector"]
let selector = NSSelectorFromString(selectorString)
0 голосов
/ 23 ноября 2018

Как предполагает RX9, нет никаких причин (по крайней мере, как вы объяснили) пометить это как @objc на уровне функций или протоколов.Следующее хорошо:

public protocol MazeProtocol: AnyObject {
    static func configurations() -> [String:Selector]
}

Смысл @objc - позволить объектам ObjC взаимодействовать с этим протоколом.Если у вас есть Objective-C, который должен взаимодействовать с этим протоколом, я настоятельно рекомендую определять этот протокол на стороне ObjC, а не на стороне Swift.(Но если у вас есть такой случай, оставьте комментарий, и мы сможем разобраться, как получить то, что вам нужно; как отмечает olejnjak, вы не можете поместить Selector непосредственно в словарь, понятный ObjC.

0 голосов
/ 23 ноября 2018

Ну [String: Selector] - это Dictionary<String, Selector>, который является структурой, а структуры не могут быть представлены в Objective-C, поэтому вам понадобится NSDictionary

@objc public protocol MazeProtocol: AnyObject {
    @objc static func configurations() -> NSDictionary
}
...