gpt4 book ai didi

objective-c - 无法让 Selector 为我的 Swift 函数工作

转载 作者:搜寻专家 更新时间:2023-11-01 06:10:41 24 4
gpt4 key购买 nike

我有一个混合的 Swift 和 Objective C 应用程序。 swift 应用程序使用一些 ObjectiveC 库来处理 OAuth2 身份验证。一旦 OAuth2 token 请求完成,其中一部分是对委托(delegate)方法的回调。

以下代码正在使用我传入的选择器的 Objective C 库 (GTMOAuth2) 中执行:

if (delegate_ && finishedSelector_) {
SEL sel = finishedSelector_;
NSMethodSignature *sig = [delegate_ methodSignatureForSelector:sel];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig];
[invocation setSelector:sel];
[invocation setTarget:delegate_];
[invocation setArgument:&self atIndex:2];
[invocation setArgument:&auth atIndex:3];
[invocation setArgument:&error atIndex:4];
[invocation invoke];
}

我想要调用的函数在我的 swift viewController 中,看起来像这样:

func authentication(viewController: GTMOAuth2ViewControllerTouch, finishedWithAuth: GTMOAuth2Authentication, error: NSError)
{
if (error != nil)
{
var alertView: UIAlertView = UIAlertView(title: "Authorisation Failed", message: error.description, delegate: self, cancelButtonTitle: "Dismiss")

alertView.show()

}
else
{
// Authentication Succeeded
self.mytoken = finishedWithAuth.accessToken
}
}

我目前传入的选择器是:

let mySelector: Selector = Selector("authentication:viewController:finishedWithAuth:error:")

并在此调用中用作参数:

let myViewController: GTMOAuth2ViewControllerTouch = GTMOAuth2ViewControllerTouch(authentication: auth, authorizationURL: authURL, keychainItemName: nil, delegate: self, finishedSelector: mySelector)

谁能告诉我为什么我的函数从未被调用过?它似乎总是在创建 NSInvocation 的那一行失败。

我尝试了多个选择器字符串,但每一个似乎都失败了。我错过了什么吗?

我也试过在函数名称前加上“@objc”,但没有用。

最佳答案

Swift 方法

func authentication(viewController: GTMOAuth2ViewControllerTouch,
finishedWithAuth: GTMOAuth2Authentication,
error: NSError)

暴露给 Objective-C 作为

-(void)authentication:(GTMOAuth2ViewControllerTouch *) viewController 
finishedWithAuth:(GTMOAuth2Authentication *) finishedWithAuth
error:(NSError *)error

表示选择器是

Selector("authentication:finishedWithAuth:error:")

一般来说,第一个参数名称不是选择器的一部分。唯一的异常(exception)是 init 方法,其中第一个参数名称合并到 Objective-C方法名。例如,Swift 初始化器

init(foo: Int, bar: Int) 

转换为 Objective-C 为

- (instancetype)initWithFoo:(NSInteger)foo bar:(NSInteger)bar

选择器将是

Selector("initWithFoo:bar:")

关于objective-c - 无法让 Selector 为我的 Swift 函数工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24488159/

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