objective-c - Objective-C 中的 Typedef 返回类型在 Swift 中不起作用

标签 objective-c swift callback typedef

我想在我的 Swift 项目中使用 Objective-C 类并导入了文件,Xcode 创建了桥头文件,一切都很酷......除了:

Objective-C 类定义函数的回调类型

typedef void (^SSScanManagerCallback)(BOOL success, NSError *error, NSArray *scannedURLs);

并在函数声明中使用类型

- (void)scanSync:(SSScanManagerCallback)callback; // Synchronous scan.

有问题的类如下:https://github.com/counsyl/scanstream/blob/master/ScanStream/SSScanManager.h#L16

如果我想在 Swift 中使用该类:

let scanManager = SSScanManager();
scanManager.scanSync({(_ success: Bool, _ error: Error, _ scannedURLs: [Any]) -> Void in
    if !success {
        // ...
    }
});

我收到以下错误:

Cannot convert value of type '(Bool, Error, [Any]) -> Void' to expected argument type 'SSScanManagerCallback!'


更新:即使我尝试像这样设置参数类型:

scanManager.scanSync({(_ justATry: SSScanManagerCallback!) -> Void in

});

我得到错误:

Cannot convert value of type '(SSScanManagerCallback!) -> Void' to expected argument type 'SSScanManagerCallback!'

但是我如何将类型设置为“SSScanManagerCallback!”按照错误消息中的要求?

最佳答案

有趣的是,似乎 Swift(使用 3.0.2 测试)现在将没有任何可空性注释的 Objective-C block 参数类型导入为强可选类型(之前它们是作为隐式展开的可选类型导入的)。不过,我似乎找不到有关此更改的文档。

因此在您的情况下,正确的签名是:

scanManager.scanSync {(success: Bool, error: Error?, scannedURLs: [Any]?) -> Void in
    // ...
}

但永远不要这样写,总是让 Swift 尽可能地推断参数类型,它会为你解决这些类型不匹配的问题。

scanManager.scanSync { success, error, scannedURLs in
    // ...
}

现在您可以点击闭包参数,Xcode 会告诉您 Swift 推断它们的类型。

关于objective-c - Objective-C 中的 Typedef 返回类型在 Swift 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41496176/

相关文章:

python - 列出回调?

javascript - 如何手动调用(查找)ReCaptcha Callback 函数?

ios - 如何避免在 MVVM 中观察圆圈

swift - Swift 中的构造函数

ios - 为什么我的按钮上的 addTarget 功能不起作用?

android被销毁时是否有任何 View 回调?

ios - 当我们导入任何文件时,Xcode 7.3 类文件搜索不可用

iphone - 如何在 Objective C 中验证空字符串?

objective-c - 在 MonoTouch 中绑定(bind) Obj-C 类别

ios - 如何将模型类字典中的值存储在 Array/NSMutableArray 中?