我想在我的 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/