我有一个带有原型的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中搜索说我在参数中传递了一些无效类型,但我在代码中找不到任何错误。从函数中删除块会使代码工作,所以我想这与调用块函数的方式有关。
感谢您的帮助!
答案 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
}