Реализация протокола Objective-C в Swift - PullRequest
0 голосов
/ 24 августа 2018

У меня есть протокол, определенный в Objective-C, например:

@protocol MyProtocol <NSObject>
- (void)doStuffWithDictionary:(NSDictionary*)dict 
                    andString:(NSString*)str1
            andOptionalString:(NSString*)str2
             andOptionalArray:(NSArray*)arr
                     callback:(void (^)(id result))onSuccess;
@end

... и я пытаюсь определить класс в Swift, который реализует этот протокол, например:

class MyImpl : Operation, MyProtocol {
    func doStuff(withDictionary dict: [AnyHashable : Any]!, 
                      andString str1: String!, 
              andOptionalString str2: String? = nil, 
                andOptionalArray arr: NSArray? = nil, 
                  callback onSuccess: ((Any?) -> Void)! {
        ...
    }
}

Тем не менее, я получаю ошибки сборки по типу:

Type 'MyImpl' does not conform to protocol 'MyProtocol'
note: candidate has non-matching type '([AnyHashable : Any]!, String!, String?, NSArray?, ((Any?) -> Void)!'
    func doStuff(withDictionary dict: [AnyHashable : Any]!, andString str1: String!, andOptionalString str2: String? = nil, andOptionalArray arr: NSArray? = nil, callback onSuccess: ((Any?) -> Void)!

Кажется, он расстроен из-за параметра andOptionalArray arr: NSArray? = nil. Какой правильный синтаксис использовать здесь?

1 Ответ

0 голосов
/ 24 августа 2018

Я поместил ваш протокол в проект и импортировал его в <ProjectName>-Bridging-Header.h, а Автозаполнение предложил следующий синтаксис:

public func doStuff(with dict: [AnyHashable : Any],
               andString str1: String,
       andOptionalString str2: String,
         andOptionalArray arr: [Any],
           callback onSuccess: @escaping (Any) -> Void) {
}

Если вы хотите, чтобы String и [Any] были импортированы как необязательные, вам нужно пометить их как nullable в Objective-C:

@protocol MyProtocol <NSObject>
- (void)doStuffWithDictionary:(NSDictionary*)dict
                    andString:(NSString*)str1
            andOptionalString:(nullable NSString*)str2
             andOptionalArray:(nullable NSArray*)arr
                     callback:(void (^)(id result))onSuccess;
@end

Как @MartinR предложил в комментариях:

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

Это тоже работает и предлагает разные интерфейсы для разных версий Swift.

...