我有一个奇怪的案例,我有以下 Objective C 协议(protocol):
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 类实现协议(protocol),如下所示:
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
类。然而,对于这个特定的代码,我不断遇到词法或预处理器问题
。现在,如果我从类中删除 public
,一切都会正常进行。但是,我不能在任何 Objective C 代码中使用 PaymentCriteria
。
如果我将类保持为公共(public)类,但从类中删除 AccountCriteria
,一切仍会正常构建。但是,我必须让这个类遵守协议(protocol)。所以这条路线对我也没有太大帮助。
所以我的问题是,为什么我不能让 Swift 类遵守 Objective C 协议(protocol),然后尝试在 Objective C 中使用该 Swift 类?还是我在 Swift 类中做错了什么有害的事情?
最佳答案
据我了解,这里的问题我们称之为循环导入。
所以,您已经创建了 Objc 协议(protocol),然后将此 Objc 文件添加到桥接 header 。它被导入到所有 swift 文件,包括您的 PaymentCriteria.swift
文件。
然后您尝试在 objc 中使用 PaymentCriteria
,这导致将其添加到伞头。通常由于这样的路径,我遇到了类似的错误。
最简单的解决方法是使用 Swift 和 @objc
创建 AccountCriteria 作为协议(protocol)。
关于ios - Objective C 到 Swift 的互操作性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53687441/