ios - Objective C 到 Swift 的互操作性问题

标签 ios objective-c swift

我有一个奇怪的案例,我有以下 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/

相关文章:

iOS iPhone SDK 将应用程序与 instagram 集成

ios - Swift MKMapView 有时会变为 nil 并且应用程序崩溃

ios - 访问不同 Controller 中的功能并初始化我的 masterViewController?

ios - 以编程方式将搜索栏和 UISearchDisplayController 添加到 UITableView

objective-c - 处理隐藏的错误 Objective C

ios - 从 Nib 中的 View 制作 GLView

ios - 启动 push segue 会导致 `Pushing a navigation controller is not supported `

swift - 如何删除 xcode 中的构建警告消息

ios - TableView 调整父 View 大小 iOS

ios - Swift 中的相机和库操作