objective-c - Swift 调用包含 block 的 Objective-C 包装器函数

标签 objective-c swift block wrapper

我有一个带有原型(prototype)的 Objective-C 包装器(ObjCWrapper.h 和 ObjCWrapper.m)

+ (void) login:(NSString *)username andPassword:(NSString *)password andErrorBlock:(SuccessBlock)errorBlock andSuccessBlock:(SuccessBlock)successBlock;

使用类型定义

typedef void (^SuccessBlock)(NSString *);

和实现

+ (void)login:(NSString *)username andPassword:(NSString *)password andErrorBlock:(SuccessBlock)errorBlock andSuccessBlock:(SuccessBlock)successBlock
{
    // do stuff like
    successBlock(@"test");
}

在我的 swift View Controller (ViewController.swift) 中,我调用了登录函数:

ObjCWrapper.login("abc", andPassword: "abc",
        andErrorBlock:
        {
            (error:String) -> Void in
            println();
        },
        andSuccessBlock:
        {
            (map:String) -> Void in
            println();
        }
    )

但是我得到错误:

无法使用类型为“(String, andPassword: String, andErrorBlock:(String)->void, andSuccessBlock:(String)->void)”的参数列表调用“login”

在 google 中搜索说我在参数中传递了一些无效类型,但我在代码中找不到任何错误。从函数中删除 block 使代码工作,所以我猜这与调用 block 函数的方式有关。

感谢您的帮助!

最佳答案

可能值得向您的完成 block 添加可空性说明符:

typedef void (^SuccessBlock)( NSString * _Nonnull );

以及方法本身:

+ (void) login:(nonnull NSString *)username andPassword:(nonnull NSString *)password andErrorBlock:(nullable SuccessBlock)errorBlock andSuccessBlock:(nullable SuccessBlock)successBlock;

然后你应该能够在 Swift 中调用你的方法:

        ObjCWrapper.login("login", andPassword: "pass", andErrorBlock: { (error:String) -> Void in
        //error handling
        }) { (map:String) -> Void in
            //other stuff
    }

关于objective-c - Swift 调用包含 block 的 Objective-C 包装器函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32559841/

相关文章:

iphone - 如何以编程方式创建多个CheckBox

ios - 从类方法访问 UINavigationController

swift - 在 Swift 函数中,为什么 'return' 必须在 for 循环之外,当函数包含一个 for 循环且循环内有 if 语句时?

swift - 如何使用 react-native 组件创建一个 swift 项目?

ruby - 允许 block 处理可变数量参数的干净方法是什么?

ios - 如何使用 AFNetworking 跟踪多个同时下载的进度?

ios - 通用链接在 Safari 中不起作用

json - 用于解析 JSON 并返回字典数组的 Swift 函数

ios - 如何在 iOS 中组合 block 和返回值的方法?

ios - 在 PickerView 中设置行标题