Swift无法识别来自Obj-C类

时间:2016-11-15 01:31:14

标签: swift xcode

我在Swift 3中工作,使用类似的应用程序,在Swift 2.3 Xcode 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。

1 个答案:

答案 0 :(得分:3)

它确实识别您的方法,但它适用于Swift 3的新命名约定。因此,当您调用此Objective-C方法时,您只需要遵循该错误消息的指导并将其称为do(at:)

result = mmocr.do(at: croppedImage)

有关详细信息,请参阅SE-0005: Better Translation of Objective-C APIs Into Swift或WWDC 2016视频Swift API Design Guidelines

顺便说一句,如果您可以修改@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-C和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或重命名方法) ,但扩展是一种与API建立优雅界面的方式,直到他们自己重新访问它为止。