我正在使用Swift 3,它是在SWIFT2.3Xcode 7下构建和运行的类似应用程序的一部分,我们正在开发一个具有相同功能的新应用程序。其中一些在外部库中。
在2.3项目中,我有一个文件:
#import <Foundation/Foundation.h>
#import <UIKit/UIImage.h>
@interface MMOCR : NSObject {
}
-(NSString*) doOCRAtImage:(UIImage*)scannedImage;
@end该文件包含在桥接头文件中,它编译并运行。这是代码:
let mmocr = MMOCR()
result = mmocr.doOCRAtImage(croppedImage)但在我的新项目中,我得到了这个:
'doOCRAtImage‘已改名为'do(at:)’。
因此,它识别类,但不识别方法。这是从2.3到3的变化吗?我还没有转换和编译旧的项目,所以我不知道它是否在3和Xcode 8下编译。
发布于 2016-11-15 02:44:22
它确实识别了您的方法,但它正在应用Swift 3的新命名约定。因此,当您调用此Objective方法时,只需遵循该错误消息的指导,并将其称为do(at:)。
result = mmocr.do(at: croppedImage)有关更多信息,请参见SE-0005:将Objective更好地翻译为Swift或WWDC 2016视频Swift API设计指南。
顺便说一句,如果您可以编辑@interface (也就是说,如果MMOCR是您自己的类),您可以用NS_SWIFT_NAME覆盖Swift名称
- (NSString*) doOCRAtImage:(UIImage *)scannedImage NS_SWIFT_NAME(doOCR(at:));然后,你就会:
let result = mmocr.doOCR(at: croppedImage)就我个人而言,如果MMOCR是您自己的类,我可能会倾向于完全重命名doOCRAtImage:,可能会重命名如下:
- (NSString*) recognizeTextInImage:(UIImage *)scannedImage;然后,Swift 3代码将是:
result = mmocr.recognizeText(in: croppedImage)这是一个比仅仅使用NS_SWIFT_NAME更显着的变化,但是它可能在Objective和Swift 3中产生更直观的代码。
如果这个MMOCR是一个第三方库,您很难修改它,那么您可以定义自己的扩展来为这个方法提供一个更有逻辑的替代名称,例如:
extension MMOCR {
func recognizeText(in image: UIImage) -> String {
return self.do(at: image)
}
}然后你就可以:
result = mmocr.recognizeText(in: croppedImage)显然,你可以随意选择你想要的名字。但是这样,您可以在代码中使用这个更符合逻辑的名称,而不是使用神秘的do(at:)语法。
就我个人而言,我会向这个MMOCR类的提供者提交一个增强请求,要求他们提供一个更符合逻辑的Swift 3接口(无论是使用NS_SWIFT_NAME还是重命名方法),但是扩展是一种在他们自己重新访问之前拥有一个优雅的接口的方法。
https://stackoverflow.com/questions/40600640
复制相似问题