Использование Objective-C addObserver в Swift - PullRequest
0 голосов
/ 17 декабря 2018

На моей работе у нас есть фреймворк, написанный на Objective-C.В одном классе DeviceMonitor у нас есть метод addObserver: NSObject<DeviceMonitorObserver> *)observer.Теперь мы пишем приложения в Swift, которые используют эту библиотеку, и при вызове этого метода Swift меняет имя просто на add.В соответствии с руководящими принципами разработки Swift API они пытаются удалить имена типов из имен методов, потому что они не нужны.( параграф «Пропустить ненужные слова» ) Однако мы считаем необходимым, чтобы эта функция называлась addObserver, поскольку, как обычно эта функция используется в коде, на самом деле не ясно, что здесь добавлено.Это выглядит примерно так:

DeviceMonitor.sharedInstance().add(self)

Self в этом случае - это, например, AppDelegate, который реализовал протокол DeviceMonitorObserver.Эта строка действительно не говорит о том, что мы добавляем сюда.Вам всегда нужно смотреть на сигнатуру метода.Хотя это раздражает, это может быть возможно в XCode с помощью быстрой справки, но при онлайн-просмотре изменений в Gerrit это не понятно, просто читая его.И действительно, называть его addObserver - не такое длинное имя, я думаю, это было бы просто идеально.Функции с именем addObserver существуют во всем Swift API.Если у вас есть веская причина, почему этот метод должен вызываться только в Swift add, дайте мне знать, я просто не вижу его.

Итак, если мы хотим вызвать этот метод addObserver в Swift, какмогу ли я достичь этого лучше всего?Решение должно быть реализовано в Objective-C, и старый метод add все еще должен быть там, помечен как устаревший, так как некоторые приложения уже работают с ним.Не могу просто сломать публичный API.Эти ограничения, к сожалению, убирают возможность иметь быстрый класс расширения, так как нам нужно использовать Objective-C.Также мы не можем использовать NS_SWIFT_NAME, так как старый метод больше не будет доступен, и существующие приложения будут выдавать ошибку вместо простого устаревшего предупреждения.

Есть идеи, как это сделать, не нарушая существующий API?

...