我有一个带有原型(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/