将ObjC函数桥接到Swift失败

时间:2018-07-27 18:27:15

标签: objective-c swift

我对某些事情感到困惑。我在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中,我为此崩溃。

1 个答案:

答案 0 :(得分:2)

Objective-C块具有可为空的参数,但是您的Swift闭包具有非可选(不可为空)参数。那是问题。

要么使Objective-C块具有不可为空的参数,要么使Swift闭包具有可选参数。

可以:

handler:(void (^)(NSDictionary<NSString *, id> * _Nonnull replyMessage))handler;

或这样做:

@escaping ([String: Any]?) -> Void