У меня есть любопытный случай, когда у меня есть следующий протокол 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?