iOS11 Swift 4 - как проверить, соответствует ли класс Swift протоколу, определенному в Objective-C? - PullRequest
0 голосов
/ 24 августа 2018

У меня есть устаревшая кодовая база с кодом, написанным на Objective-C. Я добавляю новый класс, написанный на Swift, который должен соответствовать существующим протоколам, определенным в Objective-C.

Как я могу убедиться, что мой класс Swift правильно реализует методы, определенные в протоколе Objective-C?

//In Obj-C
    @protocol OBJCLocationObserver <NSObject>
    - (void)didUpdateLocationWithModel:(nullable Model *)locationModel
                       lastLocation:(CLLocationCoordinate2D)lastLocation;
    @end


//In Swift

    extension SwiftLocationManager : OBJCLocationObserver
    {
        public func didUpdateLocation(with model: Model?, lastLocation: CLLocationCoordinate2D) {
    // How to verify this function signature is actually conforming to the Obj-C protocol and is not a new method?
    }
    }

Ответы [ 2 ]

0 голосов
/ 24 августа 2018
[MyClass conformsToProtocol:@protocol(MyProtocol)];

Согласно Apple Docs вы можете использовать conformsToProtocol:, который возвращает логическое значение, указывающее, соответствует ли получатель данному протоколу.


Пример

@protocol MyProtocol
- (void)helloWorld;
@end

@interface MyClass : NSObject <MyProtocol>
@end

Будет выставлено как:

console.log(MyClass.conformsToProtocol(MyProtocol)); 

var instance = MyClass.alloc().init();
console.log(instance.conformsToProtocol(MyProtocol))
0 голосов
/ 24 августа 2018

Убедитесь, что вы #import файл определения протокола в файл <ProjectName>-Bridging-Header.h:

#import "OBJCLocationObserver.h"

А затем вы должны увидеть сообщения об ошибках, если ваша подпись не совпадает.

Вы также можете использовать Xcode Автозаполнение . Тип:

public func didUpdateLocation

и Автозаполнение предлагает:

public func didUpdateLocation(withModel Model?, lastLocation: CLLocationCoordinate2D)

, который отличается от того, что у вас есть, и объясняет, почему он не работает.


Вот еще один способ получить интерфейс:

Как @MartinR предложил в комментарии к другому вопросу:

Перейдите в файл заголовка, где определен протокол, и выберите «Сгенерированный интерфейс» из всплывающего окна «Связанные элементы» в верхнем левом углу угол. Это покажет вам точную сигнатуру метода Swift, которую вы должны реализовать.

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