首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift不识别Obj-C类中的方法

Swift不识别Obj-C类中的方法
EN

Stack Overflow用户
提问于 2016-11-15 01:31:14
回答 1查看 1.1K关注 0票数 3

我正在使用Swift 3,它是在SWIFT2.3Xcode 7下构建和运行的类似应用程序的一部分,我们正在开发一个具有相同功能的新应用程序。其中一些在外部库中。

在2.3项目中,我有一个文件:

代码语言:javascript
复制
#import <Foundation/Foundation.h>
#import <UIKit/UIImage.h>

@interface MMOCR : NSObject {

}

-(NSString*) doOCRAtImage:(UIImage*)scannedImage;

@end

该文件包含在桥接头文件中,它编译并运行。这是代码:

代码语言:javascript
复制
 let mmocr = MMOCR()
 result = mmocr.doOCRAtImage(croppedImage)

但在我的新项目中,我得到了这个:

'doOCRAtImage‘已改名为'do(at:)’。

因此,它识别类,但不识别方法。这是从2.3到3的变化吗?我还没有转换和编译旧的项目,所以我不知道它是否在3和Xcode 8下编译。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-15 02:44:22

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

代码语言:javascript
复制
result = mmocr.do(at: croppedImage)

有关更多信息,请参见SE-0005:将Objective更好地翻译为Swift或WWDC 2016视频Swift API设计指南

顺便说一句,如果您可以编辑@interface (也就是说,如果MMOCR是您自己的类),您可以用NS_SWIFT_NAME覆盖Swift名称

代码语言:javascript
复制
- (NSString*) doOCRAtImage:(UIImage *)scannedImage NS_SWIFT_NAME(doOCR(at:));

然后,你就会:

代码语言:javascript
复制
let result = mmocr.doOCR(at: croppedImage)

就我个人而言,如果MMOCR是您自己的类,我可能会倾向于完全重命名doOCRAtImage:,可能会重命名如下:

代码语言:javascript
复制
- (NSString*) recognizeTextInImage:(UIImage *)scannedImage;

然后,Swift 3代码将是:

代码语言:javascript
复制
result = mmocr.recognizeText(in: croppedImage)

这是一个比仅仅使用NS_SWIFT_NAME更显着的变化,但是它可能在Objective和Swift 3中产生更直观的代码。

如果这个MMOCR是一个第三方库,您很难修改它,那么您可以定义自己的扩展来为这个方法提供一个更有逻辑的替代名称,例如:

代码语言:javascript
复制
extension MMOCR {
    func recognizeText(in image: UIImage) -> String {
        return self.do(at: image)
    }
}

然后你就可以:

代码语言:javascript
复制
result = mmocr.recognizeText(in: croppedImage)

显然,你可以随意选择你想要的名字。但是这样,您可以在代码中使用这个更符合逻辑的名称,而不是使用神秘的do(at:)语法。

就我个人而言,我会向这个MMOCR类的提供者提交一个增强请求,要求他们提供一个更符合逻辑的Swift 3接口(无论是使用NS_SWIFT_NAME还是重命名方法),但是扩展是一种在他们自己重新访问之前拥有一个优雅的接口的方法。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40600640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档