Протокол 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 перед методом, я получу аналогичную ошибку.

Почему вы вообще добавили @objc? Кроме того, пробовали ли вы объявить свой класс следующим образом: public protocol MazeProtocol: class { ...

iOShit I Screwed Up 23.11.2018 15:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
249
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Что ж, [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

otusweb 26.11.2018 14:49

Пока внедрение выполняется в Swift, нет необходимости отмечать этот @objc. Язык реализации суперкласса не важен. Все, что важно, - это код, который ссылается на протокол и метод.

Rob Napier 26.11.2018 15:15

На самом деле я снова погрузился в код и забыл, что использую среду выполнения objectiveC, чтобы определить, какой класс применяет этот протокол. следовательно, @objc.

otusweb 26.11.2018 16:59

В этом случае этот метод не может быть помечен как @objc, потому что Selector не может быть значением NSDictionary. Вам нужно будет переписать его, чтобы использовать что-то другое, кроме Selector (обычно вы используете String и используете NSStringFromSelector и NSSelectorFromString для преобразования). Обратите внимание, что это, вероятно, означает, что все реализующие классы также должны быть @objc, поэтому вы, вероятно, имеете в виду NSObject, а не AnyObject.

Rob Napier 26.11.2018 17:01

Мне удалось сохранить селектор в словаре, но дальше я получаю ошибку компилятора. Я создал новый вопрос с более подробной информацией, поскольку технически на этот вопрос был дан ответ, хотя моя общая проблема не решена :-) Я бы хотел, чтобы вы взглянули: stackoverflow.com/questions/53502451/…

otusweb 27.11.2018 16:04

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