我是Swift的新手我在Objective c中有一个代码,在这段代码中,NSMUtableDictionary作为一个合成处理程序块返回。
我需要点击API并在完成块中返回API响应字典。 我的代码在Objective c中完美运行。但是当我使用桥头从swift调用相同的methd时会导致崩溃。
我的目标C代码是:
MYClass.h
#import <UIKit/UIKit.h>
@interface MYClass : NSObject
typedef void(^MyCompletionHandler)(NSMutableDictionary *_Nullable);
+ (void)myMethod:(NSString*_Nullable)param ComplitionHandler:(MyCompletionHandler _Nullable)complitionHandler;
@end
MYClass.m
#import "MYClass.h"
@implementation MYClass
+ (void)myMethod:(NSString*_Nullable)param ComplitionHandler:(MyCompletionHandler _Nullable)complitionHandler {
dispatch_queue_t queue = dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
/// here I've written code to hit APi and got successfull response in nsmutableDict
NSMutableDictionary *response = [[NSMutableDictionary alloc]init];
response = jSonResponse;
dispatch_async(dispatch_get_main_queue(), ^{
complitionHandler (response);
});
});
}
@end
现在当我在我的应用程序中使用它时如果我在Objective C中使用它它运行得很好但是如果我在Swift Bridging标头中导入这个文件并且当我在Swift文件中使用它时会导致崩溃
在目标C中:
[MYClass myMethod:@”param Value” ComplitionHandler:^(NSMutableDictionary * MyResponse) {
NSLog(@"Response = %@",MyResponse);
}];
并迅速
MYClass.myMethod("param Value", complitionHandler: {(MyResponse: NSMutableDictionary) -> Void in
print("MyResponse = \(MyResponse)")
} as? MyCompletionHandler)
快速崩溃发生在以下行
complitionHandler (response);
当需要在完成块中返回响应时
dispatch_async(dispatch_get_main_queue(), ^{
complitionHandler (response); //Thread 1: EXC_BAD_ACCESS (code=1, address=0x10)
});
任何人都可以告诉我这是什么问题以及如何解决这个问题。我需要在swift和Objective c中使用in
答案 0 :(得分:3)
正如我在评论中所说,检查你的响应参数是否为零,你的问题与错误的快速翻译有关,该参数应该在目标C中可以为空并且转换为swift应该是NSMutableDictionary?
而不是{ {1}}
答案 1 :(得分:0)
首先请启用调试并添加Debug - &gt;断点 - &gt;创建异常断点。
找出正在发生的错误
我的代码版本是
typealias CompletionHandler = (NSMutableArray?) -> Void
mycompletionBlock { (array) in
print((array?.object(at: 0))!)
}
func mycompletionBlock(block: CompletionHandler)
{
let array = NSMutableArray()
array.add("hello")
block(array)
}
答案 2 :(得分:0)
将?添加到NSMutableDictionary
MYClass.myMethod("param Value", complitionHandler: {(MyResponse: NSMutableDictionary?) -> Void in
print("MyResponse = \(MyResponse)")
} as? MyCompletionHandler)