Протокол 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.

Другие вопросы по тегам