加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

objective-c – 在Swift中使用Obj-C完成块

发布时间:2020-12-16 10:02:49 所属栏目:百科 来源:网络整理
导读:在Objective-C中,我有一个完成块类定义为: File.h typedef void (^MYCompletionBlock)(BOOL success,NSDictionary *result,NSError *error); 然后,在Swift文件中,我尝试使用完成块,如下所示: Swift.swift class MyClass: NSObject{ ... func MyFunction()
在Objective-C中,我有一个完成块类定义为:

File.h

typedef void (^MYCompletionBlock)(BOOL success,NSDictionary *result,NSError *error);

然后,在Swift文件中,我尝试使用完成块,如下所示:

Swift.swift

class MyClass: NSObject{
     ...

     func MyFunction() -> Void {
          ...
          objcMethod(param1,withCompletion: {(MYCompletionBlock) -> Void in
               if (success){ // Error:"Use of unresolved identifier 'success'"
               }
          }
          ... 
     }
     ...
}

但是,我一直收到一个错误:“使用未解析的标识符’成功’”.

我也尝试了以下内容:

objcMethod(param1,withCompletion: {(success:Bool,result: NSDictionary,error:NSError) -> Void in
     if (success){ // Error:"Cannot convert value of type '(Bool,NSDictionary,NSError) -> Void' to expected argument type "MYCompletionBlock!" 
     }
}

有人可以帮我理解如何在Swift中正确指定Obj-C完成块吗?

解决方法

鉴于您的闭包没有指定可空性限定符(它们几乎肯定是可选的),可以安全地假设您的Objective-C API未经过可空性审核.因此,Swift会将指针视为隐式解包的选项.此外,现在NSDictionary被映射到[NSObject:AnyObject] Swift字典.

因此,它将是:

obj.objcMethod(param) { (success: Bool,result: [NSObject : AnyObject]!,error: NSError!) in
    if success {
        // do something
    }
}

或者,正如Kobi所指出的,您可以让编译器推断出类型:

obj.objcMethod(param) { success,result,error in
    if success {
        // do something
    }
}

请注意,您不必自己记住这一点.输入代码时,您可以利用Xcode的代码完成.因此,键入足以匹配方法名称以及何时匹配objcMethod,然后按Enter键:

enter image description here

当你到达MYCompletionBlock时,再次按回车键,它会显示正确的签名:

enter image description here

如果这个Objective-C方法是我自己的类,我会审核它的可空性.因此,例如,让我们假设param是可选的,闭包是必需的,结果和错误是可选的,你可以这样定义它:

NS_ASSUME_NONNULL_BEGIN

typedef void (^MYCompletionBlock)(BOOL success,NSDictionary * _Nullable result,NSError * _Nullable error);

@interface MyObject : NSObject

- (void)objcMethod:(NSDictionary * _Nullable)param1 withCompletionHandler:(MYCompletionBlock)completionHandler;

@end

NS_ASSUME_NONNULL_END

而且,如果是这种情况,您的Swift代码会像这样调用它:

obj.objcMethod(param) { (success: Bool,result: [NSObject : AnyObject]?,error: NSError?) in
    if success {
        // do something
    }
}

或者,再次,让编译器为您推断类型(但这次它们被推断为未隐式解包的选项):

obj.objcMethod(param) { success,error in
    if success {
        // do something
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读