目标C到Swift的互操作性问题



我有一个奇怪的情况,我有以下目标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的协议。

最新更新