Ios 目标C解决Swift互操作性问题

Ios 目标C解决Swift互操作性问题,ios,objective-c,swift,Ios,Objective C,Swift,我有一个奇怪的案例,我有以下目标C协议: NS_ASSUME_NONNULL_BEGIN @protocol AccountCriteria <NSObject> - (BOOL)criteriaIsApplicableForIdentifier:(NSString *)identifier; - (nullable id <ModularFactory>)criteriaMetForAccount:(Account *)account error:(NSError **

我有一个奇怪的案例,我有以下目标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
目的是在其他目标C代码中使用
PaymentCriteria
类。然而,对于这段特殊的代码,我不断遇到
词法或预处理器问题
。现在,如果我从类中删除
public
,一切都会正常运行。但是,我不能在任何目标C代码中使用
PaymentCriteria

如果我将该类保持为公共类,但从该类中删除
AccountCriteria
,则所有内容仍然可以正常构建。但是,我必须让这个类遵守协议。所以这条路线对我也没什么帮助


所以我的问题是,为什么我不能让一个Swift类遵守Objective C协议,然后在Objective C中尝试使用那个Swift类?或者我在Swift课程中犯了什么有害的错误?

据我所知,这里的问题称为循环导入

所以,您已经创建了Objc协议,然后将这个Objc文件添加到桥接头中。它正在导入所有swift文件,包括您的
PaymentCriteria.swift
文件。 然后尝试在objc中使用
PaymentCriteria
,从而将其添加到伞形标题中。一般来说,由于这样一条路径,我经历了类似的错误


最简单的解决方法是使用Swift和
@objc

创建AccountCriteria作为协议。据我所知,这里的问题称为循环导入

所以,您已经创建了Objc协议,然后将这个Objc文件添加到桥接头中。它正在导入所有swift文件,包括您的
PaymentCriteria.swift
文件。 然后尝试在objc中使用
PaymentCriteria
,从而将其添加到伞形标题中。一般来说,由于这样一条路径,我经历了类似的错误

最简单的解决方法是使用Swift和
@objc
将AccountCriteria创建为协议

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
    }

}