我有一个奇怪的案例,我具有以下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
}
}
目的是在其他Objective C代码中使用PaymentCriteria
类。但是,使用此特定代码,我不断得到Lexical or Preprocessor Issue
。现在,如果我从类中删除public
,一切都会很好。但是,我不能在任何Objective C代码中使用PaymentCriteria
。
如果我将班级设为公开,但从班级中删除AccountCriteria
,一切仍然可以正常进行。但是,我必须使此类遵守协议。因此,这条路线对我也没有太大帮助。
所以我的问题是,为什么我不能让Swift类遵守Objective C协议,然后尝试在Objective C中使用该Swift类?还是在Swift类中我做错了什么有害的事情?
答案 0 :(得分:3)
据我了解,这里的问题叫做循环导入。
因此,您已经创建了Objc协议,然后将该Objc文件添加到Bridging标头中。它已被导入所有快速文件,包括您的PaymentCriteria.swift
文件。
然后,您尝试在objc中使用PaymentCriteria
,这导致将其添加到伞形标题中。通常,由于这种路径,我遇到了类似的错误。
最简单的解决方法是使用Swift和@objc
将AccountCriteria创建为协议。