Swift互操作性问题的目标C

时间:2018-12-08 22:08:49

标签: ios objective-c swift

我有一个奇怪的案例,我具有以下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类中我做错了什么有害的事情?

1 个答案:

答案 0 :(得分:3)

据我了解,这里的问题叫做循环导入

因此,您已经创建了Objc协议,然后将该Objc文件添加到Bridging标头中。它已被导入所有快速文件,包括您的PaymentCriteria.swift文件。 然后,您尝试在objc中使用PaymentCriteria,这导致将其添加到伞形标题中。通常,由于这种路径,我遇到了类似的错误。

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