Задача C для быстрых проблем взаимодействия - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть любопытный случай, когда у меня есть следующий протокол Objective C:

NS_ASSUME_NONNULL_BEGIN
@protocol AccountCriteria <NSObject>
- (BOOL)criteriaIsApplicableForIdentifier:(NSString *)identifier;
- (nullable id <ModularFactory>)criteriaMetForAccount:(Account *)account error:(NSError **)error NS_SWIFT_NOTHROW;
@end
NS_ASSUME_NONNULL_END

. Я решил, что класс Swift реализует этот протокол, например:

import Foundation

@objc(PaymentCriteria)
public class PaymentCriteria: NSObject, AccountCriteria {

    public func criteriaIsApplicable(forIdentifier identifier: String) -> Bool {
        //Lots of code here
    }

    public func criteriaMet(for account: Account, error: NSErrorPointer) -> ModularFactory? {

        //Lots of code here
    }

}

Предполагается использовать класс PaymentCriteria в другом коде Objective C.Однако с этим конкретным кодом я продолжаю получать Lexical or Preprocessor Issue.Теперь, если я удалю public из класса, все будет нормально.Однако я не могу использовать PaymentCriteria в любом коде Objective C.

Если я оставлю класс открытым, но удалю AccountCriteria из класса, все по-прежнему будет работать нормально.Тем не менее, я должен иметь этот класс соблюдать протокол.Так что этот маршрут мне тоже не очень помогает.

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

1 Ответ

0 голосов
/ 09 декабря 2018

Как я понял, проблема здесь с этим, давайте назовем это циклическим импортом .

Итак, вы создали протокол Objc, а затем добавили этот файл Objc в заголовок Bridging.Он импортируется во все файлы swift, включая ваш PaymentCriteria.swift файл.Затем вы пытаетесь использовать PaymentCriteria обратно в objc, что приводит к добавлению его в заголовок зонтика.И обычно из-за такого пути я сталкивался с подобными ошибками.

Самый простой обходной путь - это создание AccountCriteria в качестве протокола с использованием Swift с @objc.

...