2016-11-15 1 views
3

저는 Swift 3에서 작업하고 있습니다. Swift 2.3 Xcode 7에서 빌드하고 실행하는 비슷한 응용 프로그램을 사용하고 있습니다. 우리는 동일한 기능 . 이 중 일부는 외부 라이브러리에 있습니다. 2.3 프로젝트에서 Swift가 Obj-C 클래스의 메서드를 인식하지 못합니다.

, 나는 파일이 : 파일이 브리지 헤더 파일에 포함되어

#import <Foundation/Foundation.h> 
#import <UIKit/UIImage.h> 

@interface MMOCR : NSObject { 

} 

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

@end 

것을, 그리고 컴파일 및 실행됩니다.

'doOCRAtImage' '할가 (에 :'

따라서는 인식으로 이름이 변경되었습니다 : 이것은

let mmocr = MMOCR() 
result = mmocr.doOCRAtImage(croppedImage) 

하지만 내 새로운 프로젝트에

, 내가 갖는 :이 코드입니다 클래스는 아니지만 메서드는 아닙니다. 2.3에서 3으로 변경 되었습니까? 아직 변환하지 않았고 오래된 프로젝트를 컴파일하지 않았으므로이 파일이 3 및 Xcode 8에서 컴파일되는지는 알 수 없습니다.

답변

3

그것은 사용자의 방법을 인식하지만 Swift 3의 새로운 명명 규칙을 적용합니다. 그래서, 당신이 목표 - C 메서드를 호출 할 때, 당신은 단순히 해당 오류 메시지의 지침을 따라 do(at:)로 전화를 걸 :

result = mmocr.do(at: croppedImage) 

자세한 내용은 SE-0005: Better Translation of Objective-C APIs Into Swift 또는 2016 WWDC 비디오 Swift API Design Guidelines를 참조하십시오. 편집 할 수있는 경우 그런데


@interface (즉, MMOCR 자신의 클래스 인 경우), 당신은 NS_SWIFT_NAME와 스위프트 이름을 재정의 할 수

- (NSString*) doOCRAtImage:(UIImage *)scannedImage NS_SWIFT_NAME(doOCR(at:)); 

를 그리고, 당신이 할 것입니다 :

let result = mmocr.doOCR(at: croppedImage) 

개인적으로, MMOCR 경우 O했다 WN 클래스는, 나는 아마도 같은 것으로, 완전히 doOCRAtImage:의 이름을 변경하는 유혹 될 수 있습니다 다음

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

, 스위프트 3 코드는 다음과 같습니다

result = mmocr.recognizeText(in: croppedImage) 

이 그냥 NS_SWIFT_NAME를 사용하는 것보다 더 극적인 변화입니다 이 MMOCR 타사 라이브러리 일 경우, 그러나 둘 다 목표 - C에서보다 직관적 인 코드를 생성하고 스위프트 3.


수 쉽게 수정할 수 없습니다, 당신은 항상이 방법에게 대안을 제공하기 위해 자신의 내선을 정의 할 수 있습니다, 더 논리적 이름, 예 :

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를 사용할 때까지 우아한 인터페이스를 제공합니다.

+0

지연으로 인해 불편을 끼쳐 드려 죄송합니다. 응답 주셔서 감사합니다, 이것은 정확하게 그랬습니다. 하지만 나는 여기서 뭔가를 놓치고 있니? 언어/컴파일러는 내 기능의 이름을 지정할 수 없으며 지정할 수없는 것을 내게 지시하고 있습니까? 이 경우이 라이브러리는 우리가 사용하고있는 라이브러리입니다. 나는이 프로젝트가 처음인데 어디서 왔는지 모르겠지만 소스는 없다. 그래서 함수의 실제 이름을 바꿀 수는 없습니다. Swift는 경고 대신 컴파일 타임 오류가 발생하지 않도록 자유롭게 생각하십니까? 나는 여기서 뭔가를 놓치기를 바란다 ... – mickm

+0

컴파일러는 기술적으로 당신의 메소드의 이름을 쓰지 않는다. API 작성자는 원하는 것을 호출 할 수 있습니다. 그러나 Objective-C 이름이 Swift 3에서 렌더링되는 방법을 규정하고 있습니다. API가 기존 규칙을 따르는 경우, 일반적으로 간결하고 표현적인 Swift 구문이됩니다. 사실, 애플은 오랫동안 "이 보조 동사가 의미를 추가하는 경우가 거의 없기 때문에 오랫동안 메소드 이름에'do '를 사용하는 것을 오랫동안 권장하지 않았다.) 불행히도, 사용중인 API는 빈약 한 이름을 가지고 있기 때문에 그 어색한' 'NS_SWIFT_NAME' 한정자가없는 경우 (at :)'구문을 사용하십시오. – Rob

+0

예, 당신이 말하는 것을 봅니다. 나는 NS_SWIFT_NAME과 함께 메서드를 사용했고 좋은 것으로 부르고있다. 여전히 나에게 너무 조심스럽게 보이는데, 나는 이것이 경고이고 오류가 아니 었으면 좋겠다. 귀하의 답변에 감사 드리며, 많은 도움이되었습니다! – mickm

관련 문제