Swift调用包含块的Objective-C包装函数

时间:2015-09-14 07:58:55

标签: objective-c swift block wrapper

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

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

使用typedef

typedef void (^SuccessBlock)(NSString *);

和实施

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

从我的swift视图控制器(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)'

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

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

可能值得在完成块中添加可空性说明符:

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
    }

答案 1 :(得分:0)

Obj-C NSString!= Swift String 换句话说,您传递一个String,其中需要NSString。 把它扔掉应该可以解决这个问题。

答案 2 :(得分:0)

这就是我最终做的事情

let username = "username" //usernameField.text
let password = "password" //passwordField.text

        ObjCWrapper.login(username, andPassword: password,
            andErrorBlock:
            {
                (map) -> Void in
                // stuff
            })
            {
                (map) -> Void in
                // stuff
            }