Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使Swift类符合Objective-C协议,而不暴露于Objective-C?_Objective C_Swift_Nsobject_Bridging Header_Language Interoperability - Fatal编程技术网

如何使Swift类符合Objective-C协议,而不暴露于Objective-C?

如何使Swift类符合Objective-C协议,而不暴露于Objective-C?,objective-c,swift,nsobject,bridging-header,language-interoperability,Objective C,Swift,Nsobject,Bridging Header,Language Interoperability,我有一个名为LoginCoordinator的Swift类,它可以根据Apple请求执行登录。为了响应回调,它符合ASAuthorizationControllerDelegate。由于此要求,我还需要将此类设置为NSObject的子类: 任何Objective-C类都不会使用该类。它将被其他Swift类(即LoginViewController)使用,而Objective-C类确实会使用它 问题如下。我最终通过以下操作将顶级Swift类导入Objective-C: #import "

我有一个名为LoginCoordinator的Swift类,它可以根据Apple请求执行登录。为了响应回调,它符合ASAuthorizationControllerDelegate。由于此要求,我还需要将此类设置为NSObject的子类:

任何Objective-C类都不会使用该类。它将被其他Swift类(即LoginViewController)使用,而Objective-C类确实会使用它

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

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

找不到“ASAuthorizationControllerDelegate”的协议声明;你的意思是“UINavigationControllerDelegate”吗

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

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

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

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


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

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

类登录协调员{ 私有授权代理:LoginCordinatoraAuthorizationControllerDelegate{ 后勤协调员授权控制员远程协调员:自我 } } //标记:来自ASAuthorizationControllerDelegate的函数,但不符合它 扩展登录协调员{ 私有函数授权控制器控制器:作为授权控制器,已完成授权。。。。 } 私有类LoginCoordinatoraAuthorizationControllerDelegate:NSObject,ASAuthorizationControllerDelegate{ 弱var协调器:LoginCoordinator! initcoordinator:LoginCoordinator } 您还可以将LoginCoordinator设置为不能公开给Objective-C的嵌套类

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

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

类登录协调员{ 私有授权代理:LoginCordinatoraAuthorizationControllerDelegate{ 后勤协调员授权控制员远程协调员:自我 } } //标记:来自ASAuthorizationControllerDelegate的函数,但不符合它 扩展登录协调员{ 私有函数授权控制器控制器:作为授权控制器,已完成授权。。。。 } 私有类LoginCoordinatoraAuthorizationControllerDelegate:NSObject,ASAuthorizationControllerDelegate{ 弱var协调器:LoginCoordinator! initcoordinator:LoginCoordinator } 您还可以将LoginCoordinator设置为不能公开给Objective-C的嵌套类

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

最简单的方法是添加

进口


对于Objective-C桥接标头,即MyProject Swift.h,最简单的方法是添加

进口


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

,所以问题是您不想在MyProject Swift.h之前到处导入AuthenticationServices?或者,您可以将LoginCoordinator放在单独的模块中,并私下遵守ASAuthorizationControllerDelegate。您只需要导入该模块,而不是导入-Swift。h@Cy-4啊,好主意。理想情况下,我希望避免创建一个新模块,但如果我找不到其他方法,那么我可能会这样做。如果它也适用于您,请接受它作为答案。因此,问题是您不想在MyProject Swift.h之前到处导入AuthenticationServices?或者,您可以将LoginCoordinator放在单独的模块中,并私下遵守AuthorizationControllerDelegate。您只需要导入该模块,而不是导入-Swift。h@Cy-4啊,好主意。理想情况下,我希望避免创建一个新模块,但如果我找不到其他方法,那么我可能会这样做。如果这对你也有用的话 她接受这个答案。