私はSwift3で作業しており、Swift 2.3 Xcode7でビルドおよび実行される同様のアプリの一部を使用しています。同じ機能のいくつかを備えた新しいアプリを開発しています。この一部は外部ライブラリにあります。
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とXcode8でコンパイルされるかどうかはわかりません。
それはあなたのメソッドを認識しますが、Swift3の新しい命名規則を適用しています。あなたはこのObjective-Cのメソッドを呼び出すときに、あなたは単にそのエラーメッセージのガイダンスに従うとして、それを呼び出すようにしたいですdo(at:)
:
result = mmocr.do(at: croppedImage)
詳細については、Objective-CのAPIの中へスウィフトのより良い翻訳:SE-0005またはWWDC 2016のビデオ・スウィフトAPIの設計ガイドラインを。
ところで、あなたは編集することができた場合@interface
(つまり場合はMMOCR
独自のクラスだった)、あなたはスウィフトの名前でを上書きすることができますNS_SWIFT_NAME
:
- (NSString*) doOCRAtImage:(UIImage *)scannedImage NS_SWIFT_NAME(doOCR(at:));
次に、次のことを行います。
let result = mmocr.doOCR(at: croppedImage)
個人的には、もしMMOCR
あなた自身のクラスだったらdoOCRAtImage:
、おそらく次のような名前に完全に名前を変更したくなるかもしれません。
- (NSString*) recognizeTextInImage:(UIImage *)scannedImage;
その場合、Swift3のコードは次のようになります。
result = mmocr.recognizeText(in: croppedImage)
これは、単に使用するよりも劇的な変化であるNS_SWIFT_NAME
が、それは、両方のObjective-Cとスウィフト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とのエレガントなインターフェイスを提供する方法です。彼らがこれを彼ら自身で再訪するような時まで。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加