gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:27:19 29 4
gpt4 key购买 nike

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com