gpt4 book ai didi

objective-c - 如何使 Swift 类符合 Objective-C 协议(protocol),而不将其暴露给 Objective-C?

转载 作者:行者123 更新时间:2023-12-03 08:38:51 25 4
gpt4 key购买 nike

我有一个名为 LoginCoordinator 的 Swift 类执行“使用 Apple 登录”请求。为了响应回调,它符合 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”的协议(protocol)声明;您的意思是“UINavigationControllerDelegate”吗?

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

如果,在导入之前MyProject-Swift.h ,我还导入<AuthenticationServices/AuthenticationServices.h> ,然后错误消失。但我不想在导入 Swift 的任何地方都导入它。

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

我注意到MyProject-Swift.h才开始生成 LoginCoordinator 的代码一旦我将它作为 NSObject 的子类。删除子类会删除生成的代码,但它当然不能符合协议(protocol)。

有没有办法让 Swift 类成为 NSObject 的子类并符合 Objective-C 协议(protocol),并且在 Objective-C 中导入 Swift 文件时不暴露它?

最佳答案

您可以创建一个实际上符合 ASAuthorizationControllerDelegate 的私有(private)对象,并将消息转发给 LoginCoordinator。虽然很难看,但可以解决问题。

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)
}

您还可以使您的 LoginCoordinator 成为一个无法公开给 Objective-C 的嵌套类。

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

关于objective-c - 如何使 Swift 类符合 Objective-C 协议(protocol),而不将其暴露给 Objective-C?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63169021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com