Я пытаюсь создать протокол, в котором один из методов вернет словарь селектора. Но у меня проблема ...
вот код протокола:
@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 перед методом, я получу аналогичную ошибку.





Что ж, [String: Selector] - это Dictionary<String, Selector>, который является структурой, и структуры не могут быть представлены в Objective-C, поэтому вам понадобится NSDictionary.
@objc public protocol MazeProtocol: AnyObject {
@objc static func configurations() -> NSDictionary
}
Поскольку вы не можете использовать 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)
Как предполагает RX9, нет причин (по крайней мере, вы объяснили) отмечать это как @objc ни на уровне функции, ни на уровне протокола. Следующее нормально:
public protocol MazeProtocol: AnyObject {
static func configurations() -> [String:Selector]
}
Задача @objc - позволить объектам ObjC взаимодействовать с этим протоколом. Если у вас есть Objective-C, который должен взаимодействовать с этим протоколом, я настоятельно рекомендую определять этот протокол на стороне ObjC, а не на стороне Swift. (Но если у вас есть такой случай, оставьте комментарий, и мы расскажем, как получить то, что вам нужно; как отмечает олейняк, вы не можете поместить Selector непосредственно в словарь, который понимает ObjC.
Моя цель состоит в том, чтобы UIView и UIViewController приняли этот протокол, поэтому я понимаю, что мне нужен @objc
Пока внедрение выполняется в Swift, нет необходимости отмечать этот @objc. Язык реализации суперкласса не важен. Все, что важно, - это код, который ссылается на протокол и метод.
На самом деле я снова погрузился в код и забыл, что использую среду выполнения objectiveC, чтобы определить, какой класс применяет этот протокол. следовательно, @objc.
В этом случае этот метод не может быть помечен как @objc, потому что Selector не может быть значением NSDictionary. Вам нужно будет переписать его, чтобы использовать что-то другое, кроме Selector (обычно вы используете String и используете NSStringFromSelector и NSSelectorFromString для преобразования). Обратите внимание, что это, вероятно, означает, что все реализующие классы также должны быть @objc, поэтому вы, вероятно, имеете в виду NSObject, а не AnyObject.
Мне удалось сохранить селектор в словаре, но дальше я получаю ошибку компилятора. Я создал новый вопрос с более подробной информацией, поскольку технически на этот вопрос был дан ответ, хотя моя общая проблема не решена :-) Я бы хотел, чтобы вы взглянули: stackoverflow.com/questions/53502451/…
Почему вы вообще добавили @objc? Кроме того, пробовали ли вы объявить свой класс следующим образом:
public protocol MazeProtocol: class { ...