我有一个奇怪的情况,我有以下目标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
。
如果我将类保持为public,但从类中删除AccountCriteria
,那么一切仍然构建良好。然而,我必须让这个班遵守协议。所以这条路线对我帮助不大。
所以我的问题是,为什么我不能让Swift类遵守Objective C协议,然后尝试在Objective C中使用该Swift类?还是我在斯威夫特班上做错了什么坏事?
正如我所理解的,这里的问题让我们称之为循环导入。
因此,您已经创建了Objc协议,然后将此Objc文件添加到桥接标头中。它被导入到所有swift文件中,包括您的PaymentCriteria.swift
文件。然后尝试在objc中使用PaymentCriteria
,这将导致将其添加到伞形标头中。总的来说,因为这样的道路,我经历了类似的错误。
最简单的解决方法是将AccountCriteria创建为使用Swift和@objc
的协议。