【问题标题】:Objective C to Swift interoperability issuesObjective C 到 Swift 的互操作性问题
【发布时间】:2018-12-08 22:08:48
【问题描述】:

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

【问题讨论】:

    标签: ios objective-c swift


    【解决方案1】:

    据我了解,这里的问题我们称之为循环导入

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多