Swift 5: Как вы выполняете селектор на объекте?

#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;  

После большого переполнения Стека я не смог найти изящного решения. Все решения, по-видимому, предполагают:

  1. Составьте протокол наблюдателя.
  2. Создайте класс, соответствующий протоколу наблюдателя.
  3. Сделайте всех своих наблюдателей подклассом из вышеперечисленного класса.

Если у кого-нибудь есть изящное решение для набора, которое не предполагает создания новых классов, я весь внимание. До тех пор…

Я решил попробовать использовать вместо этого эту структуру данных:

 private var notificationsMap: [String: [AnyHashable: Selector]] = [:]  

Таким образом, я бы не полагался на протокол для определения поведения receiveNotification, но вместо этого у меня был бы селектор для вызова каждого объекта, подписанного на уведомление.

В моей функции post для Центра уведомлений у меня есть этот код, который должен:

  1. Найдите словарь, связанный с именем уведомления.
  2. Выполните итерацию по словарю, вызывая селектор для каждого объекта.
 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-C NSNotificationCenter в Swift. Вы могли бы сделать это в Objective C, или, если вам нужна функциональность без точного API, просто закройте хранилище — что гораздо более «быстро».

2. AnyHashable не гарантирует, что вы также NSObjectProtocol performSelector насытитесь, что, помимо прочего, описывает.