如何使Swift类符合Objective-C协议,而不将其暴露给Objective-C



我有一个名为LoginCoordinator的Swift类;登录苹果";要求为了响应回调,它符合ASAuthorizationControllerDelegate。由于这个需求,我还需要使这个类成为NSObject:的子类

class LoginCoordinator: NSObject { ... }
extension LoginCoordinator: ASAuthorizationControllerDelegate { ... }

这个类根本不会被任何Objective-C类使用。它打算被其他Swift类(即LoginViewController(使用,这些类确实会被Objective-C类使用

问题如下。我最终通过以下操作将顶级Swift类导入Objective-C:

#import "MyProject-Swift.h"

这会在生成的MyProject-Swift.h文件中导致编译时错误,该文件显示:

找不到"ASAuthorizationControllerDelegate"的协议声明;你是说"UINavigationControllerDelegate"吗

这个错误出现在生成的Objective-C类别的行上,该类别对应于我在Swift中上面写的扩展,我在其中使LoginCoordinator符合ASAuthorizationControllerDelegate

如果在导入MyProject-Swift.h之前,我也导入了<AuthenticationServices/AuthenticationServices.h>,那么错误就会消失。但我不想在我进口Swift的任何地方都进口这个。

如果我理解正确的话,事情是这样的:当我将Swift文件导入Objective-C时,它会导入MyProject-Swift.h中所有生成的头文件。但其中一个类别标头(LoginCoordinator(引用了尚未导入的协议(ASAuthorizationControllerDelegate(,这会引发错误。

我注意到MyProject-Swift.h只是在我将其作为NSObject的子类后才开始为LoginCoordinator生成代码。删除子类会删除生成的代码,但它当然不符合协议。

有没有一种方法可以使Swift类成为NSObject的子类,并符合Objective-C协议,而不会在Objective-C中导入Swift文件时暴露它?

您可以创建一个实际符合ASAuthorizationControllerDelegate的私有对象,并将消息转发给LoginCordinator。它很难看,但可以解决问题。

class LoginCoordinator {
private lazy var authDelegate: LoginCordinatorASAuthorizationControllerDelegate {
LoginCordinatorASAuthorizationControllerDelegate(coordinator: self)
}
}
//MARK: functions from ASAuthorizationControllerDelegate, but not conforms it
extension LoginCoordinator {
private func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization....)
}
private class LoginCordinatorASAuthorizationControllerDelegate: NSObject, ASAuthorizationControllerDelegate {
weak var coordinator: LoginCoordinator!
init(coordinator: LoginCoordinator)
}

您还可以将LoginCordinator设置为嵌套类,该类不能向Objective-C公开。

enum Login {
class Coordinator: NSObject, ASAuthorizationControllerDelegate {...}
}

最简单的方法是添加

#import <AuthenticationServices/AuthenticationServices.h>

到Objective-C桥接头,即MyProject-Swift.h

最新更新