我对某些事情感到困惑。我在ObjC的框架中有这段代码。
handler:(void (^)(NSDictionary<NSString *, id> *replyMessage))handler;
我在Swift中有一个函数,其参数类型为
@escaping ([String: Any]) -> Void
并尝试将其传递给ObjC Framework函数。编译器抱怨并说强制转换为
guard let handler = handler as? (([String : Any]?) -> Void) else {
return
}
为什么编译器要求我使用可选的字典将其转换为其他类型?当我这样做时,由于类型不是强制类型转换而导致转换失败,但是如果我尝试按原样传递函数,则编译器不会让我告诉我需要强制转换。
我的ObjC函数是否有问题,以使Swift更快乐?
我尝试将_Nonnull放在NSDictionary之前的框架声明中,然后编译器说,
Nullability specific _Nonnull cannot be applied to non-pointer type 'NSDictionary..."
顺便说一句,在Swift 4.0中,我听了编译器并强制广播了处理函数
handler as! (([String : Any]?) -> Void)
当我调用使用它的函数并且它曾经工作时。现在在Xcode 9.3中,我为此崩溃。
答案 0 :(得分:2)
Objective-C块具有可为空的参数,但是您的Swift闭包具有非可选(不可为空)参数。那是问题。
要么使Objective-C块具有不可为空的参数,要么使Swift闭包具有可选参数。
可以:
handler:(void (^)(NSDictionary<NSString *, id> * _Nonnull replyMessage))handler;
或这样做:
@escaping ([String: Any]?) -> Void