#ios #swift #set #protocols #selector
#iOS #быстрый #набор #протоколы #селектор
Вопрос:
Я внедряю, в качестве упражнения, центр NSNotificationCenter. Моя исходная структура данных для карты, которая будет содержать наблюдателей, была:
protocol CustomObserver : Hashable { func receiveNotification(userInfo: [AnyHashable : Any]?) } //....class declaration and init for CustomNotificationCenter private var notificationsMap: [String: Setlt;CustomObserversgt;] = [:]
где у пользовательских серверов будет вызов receiveNotification (…). Однако я обнаружил, что у меня не может быть набора протокола в Swift:
// This syntax did not work given the above code blocks. Setlt;CustomObservergt;
После большого переполнения Стека я не смог найти изящного решения. Все решения, по-видимому, предполагают:
- Составьте протокол наблюдателя.
- Создайте класс, соответствующий протоколу наблюдателя.
- Сделайте всех своих наблюдателей подклассом из вышеперечисленного класса.
Если у кого-нибудь есть изящное решение для набора, которое не предполагает создания новых классов, я весь внимание. До тех пор…
Я решил попробовать использовать вместо этого эту структуру данных:
private var notificationsMap: [String: [AnyHashable: Selector]] = [:]
Таким образом, я бы не полагался на протокол для определения поведения receiveNotification, но вместо этого у меня был бы селектор для вызова каждого объекта, подписанного на уведомление.
В моей функции post для Центра уведомлений у меня есть этот код, который должен:
- Найдите словарь, связанный с именем уведомления.
- Выполните итерацию по словарю, вызывая селектор для каждого объекта.
func post(name: String, object: Any?, userInfo: [AnyHashable : Any]?) { if let obsArray = notificationsMap[name] { for (object, selector) in obsArray { object.performSelector(onMainThread: selector, withObject: nil, waitUntilDone: true) } } }
Однако в строке performSelector я получаю эту ошибку:
Value of type 'AnyHashable' has no member 'performSelector'
Так как же мне это сделать? Как мне выполнить выбор? Или…как я могу заставить набор работать?
Комментарии:
1. Вероятно, вам потребуется использовать
[NSObject: Selector]
, так как отправка селектора является частью Objective C, а не Swift. Я знаю, что это всего лишь упражнение, но нет особого смысла пытаться заново реализовать стиль Objective-CNSNotificationCenter
в Swift. Вы могли бы сделать это в Objective C, или, если вам нужна функциональность без точного API, просто закройте хранилище — что гораздо более «быстро».2.
AnyHashable
не гарантирует, что вы такжеNSObjectProtocol
performSelector
насытитесь, что, помимо прочего, описывает.