Как использовать Struct в качестве наблюдателя в NotificationCenter - PullRequest
0 голосов
/ 30 июня 2019

В классе NotificationCenter, почему Apple создала Observer типа Any?

func addObserver(Any, selector: Selector, name: NSNotification.Name?, object: Any?)

Мои рассуждения.

  1. Если наблюдатель имеет структуру, то при назначении внутри в качестве параметра функции он будет скопирован, тогда как мой наблюдатель может получить уведомление.
  2. Я не могу написать функцию, которая использует префикс @objc в Struct.
  3. Селектор всегда имеет тип @ objc.

Так что толку от Any в addObserver ..... Он всегда должен иметь тип AnyObject.

Во-вторых, мы уже знаем, что NotificationCenter хранит слабую копию обозревателя, и мы не можем использовать слабый модификатор для типа Any. Тогда как Apple справляется со всем этим?

Любая помощь в понимании этой концепции высоко ценится.

Ответы [ 3 ]

0 голосов
/ 30 июня 2019

Почему введите Any? - потому что в Objective C это тип id.

Почему вы не можете пометить свою функцию как @obj - @obc - ключевое слово для кода Swift, которое указываеткакой компилятор должен добавить этот метод в файл заголовка для этого Class , да, вы можете создавать заголовки только для Classes .

Селектор также является термином target-c,он просто говорит, какую функцию вызывать, подобно msg_send

0 голосов
/ 30 июня 2019

В классе NotificationCenter, почему Apple создала Observer типа Any.

Потому что все Объектив-C id декларации переводятся в Swift как Any.

Вы можете возразить, что это действительно должен быть AnyObject, потому что здесь будет работать только класс. И действительно, именно так id раньше переводили на Свифт. Но в настоящее время вы можете передать все, где ожидается id, потому что, если Objective-C не может этого понять, он будет упакован как экземпляр класса (например, как _SwiftValue), чтобы можно было выполнить округление. -поездка в Objective-C и обратно в Swift. Поэтому id переводится как Any.

Однако, только то, что вы можете передать структуру здесь, не означает, что вы должны это сделать. Это не сработает, как вы обнаружили. Objective-C не может анализировать структуру Swift.

Есть лотов подобных ситуаций, когда Какао дает вам достаточно места, чтобы повеситься, пропустив не ту вещь. contents CALayer набирается как Any, но если вы передадите что-либо кроме CGImage, ничего не произойдет. layerClass, если UIView имеет тип AnyClass, но вам лучше передать подкласс CALayer. Я мог бы продолжать и продолжать.

0 голосов
/ 30 июня 2019

Никто не решил сделать этот параметр Any. Это именно то, что они получили по умолчанию. Он автоматически соединяется с ObjC:

- (void)addObserver:(id)observer 
        selector:(SEL)aSelector
        name:(nullable NSNotificationName)aName
        object:(nullable id)anObject;

По умолчанию мост id является Any. Это не было специально улучшено для Swift. На практике вы не можете реально использовать структуры здесь. Тот факт, что компилятор не помешает вам вызывать его бесполезным образом, не означает, что он предназначен для такого использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...