Протокол Swift для возврата словаря селектора
Я пытаюсь создать протокол, где один из методов вернет словарь селектора. Но я сталкиваюсь с проблемой...
вот код протокола:
@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 ответа
Что ж [String: Selector]
является Dictionary<String, Selector>
которая является структурой и структурами, не может быть представлена в Objective-C, поэтому вам понадобится NSDictionary
@objc public protocol MazeProtocol: AnyObject {
@objc static func configurations() -> NSDictionary
}
Как вы не можете использовать Selector
в цели 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)
Как говорит RX9, нет причин (по крайней мере, что вы объяснили) пометить это как @objc
на уровне функции или протокола. Следующее хорошо:
public protocol MazeProtocol: AnyObject {
static func configurations() -> [String:Selector]
}
Точка @objc
позволяет объектам ObjC взаимодействовать с этим протоколом. Если у вас есть Objective-C, который должен взаимодействовать с этим протоколом, я настоятельно рекомендую определять этот протокол на стороне ObjC, а не на стороне Swift. (Но если у вас есть такой случай, оставьте комментарий, и мы сможем узнать, как получить то, что вам нужно; как отмечает olejnjak, вы не можете поместить Selector непосредственно в словарь, понятный ObjC.