Расширение протокола Swift в классе Objective- C - PullRequest
0 голосов
/ 07 мая 2020

У меня есть протокол, написанный на Swift, который должен согласовываться несколькими контроллерами, и некоторые из них написаны на Objective- C. Не всем из них нужны все методы из этого протокола Swift, поэтому сначала я решил предоставить некоторые методы с реализацией по умолчанию, чтобы сделать их «необязательными», но в этом случае мои контроллеры Objective- C не распознают мой протокол Swift. Кто-нибудь сталкивался с такой же ситуацией и нашел решение? Пример моего кода:

@objc public protocol SwiftProtocol: AnyObject {
         func requiredMethod()
         func optionalMethod()
}

extension SwiftProtocol {
    func optionalMethod() {}
}
@interface ObjClass ()<SwiftProtocol>

И у меня есть ошибка: (59, 1) Не удается найти объявление протокола для SomeProtocol. Использование @ obj c publi c в методах вместо расширение дало тот же результат. TIA за вашу помощь!

1 Ответ

1 голос
/ 07 мая 2020
Протоколы

Objective- C не могут иметь реализации по умолчанию. Протоколы

Objective- C могут иметь реальные дополнительные методы / свойства, в отличие от протоколов Swift, которые имеют только требуемые методы / свойства. Обходным путем для этого в Swift является использование реализации по умолчанию, однако, к сожалению, их нельзя увидеть в Objective- C.

Я бы предложил создать чистый протокол Swift и для всех Objective- C классы, которые хотят расширить это, напишите соответствие в Swift, затем создайте функции-оболочки @objc в Swift, которые вызывают реализации протокола по умолчанию - если его нужно вызвать, если его не нужно вызывать, просто игнорируйте его.

Что-то вроде:

protocol SwiftProtocol {
    func requiredFunc()
    func optionalFunc()
}

extension SwiftProtocol {
    func optionalFunc() {}
}

@objc extension ObjcClass: SwiftProtocol {
    @objc func requiredFunc() {
        print("do something")
    }

    // This will call the default implementation - can be omitted if you don't need to call the default implementation from Objective-C
    @objc func objc_optionalFunc() {
        optionalFunc()
    }
}
...