[objective-c] Objective-C 클래스에서 Swift 프로토콜 가져 오기

라는 AnalyticProtocolObjective-C 클래스로 명명 된 Swift 프로토콜을 가져 오려고합니다 AnalyticFactory.

protocol AnalyticProtocol
{

}

기존 Objective-C 프로젝트에서 시작하고 있습니다 (xCode로 새 Swift 프로젝트를 만들지 않았고 Objective-C 프로젝트를 xCode 6에서 Swift 프로젝트로 구성하는 방법을 찾지 못했습니다 ).

내 Swift 파일에 .h이름이 지정된 파일을 포함 MyProjectName-Swift.h했지만 컴파일러 가 존재하지 않는다는 오류를 반환 합니다 . 그래서 실제로 비어있는 .h이름 의 파일을 만들었습니다 MyProjectName-Swift.h(무엇을 넣어야할지 모르겠습니다).

에서 애플 문서 그들은 내가 내 포함 할 필요가 있다고 말했다 .h지정된 파일 MyProjectName-Swift.h내에서 .m파일을. 하지만 내 .m파일이 아니라 내 .h. 이것이 문제가 될 수 있습니까?

컴파일을 시도 할 때 다음 오류가 발생합니다. : 0 : 오류 : xxxAnalyticFactory.h : 39 : ‘AnalyticProtocol’에 대한 프로토콜 선언을 찾을 수 없습니다.

그리고 기소 된 코드 :

@interface AnalyticFactory : NSObject
{
    Class<AnalyticProtocol> _analyticProtocolClass; // The type of the analytic class currently used.
}

Swift 프로토콜을 Objective-C 클래스로 가져올 수있는 방법을 잘 이해하지 못하는 것 같습니다.

내가하는 일에 오류가있는 사람이 있습니까?



답변

다음 @objc과 같이 Swift 프로토콜에 속성 을 추가해야합니다 .

@objc protocol AnalyticProtocol {

}


답변

objC 헤더 파일에서 Xcode 생성 Swift 헤더를 가져올 수 없습니다.

따라서 objC 헤더 파일에서 Swift 코드를 사용하려면 다음과 같이 objC 헤더 파일에서 사용하려는 클래스와 프로토콜을 “전달 선언”해야합니다.

@protocol AnalyticProtocol;

이제 objC 클래스 선언에서 프로토콜을 사용할 수 있습니다.

@interface AnalyticFactory : NSObject
{
    Class<AnalyticProtocol> _analyticProtocolClass; // The type of the analytic class currently used.
}

구현 파일 (objC .m 파일)에서 Xcode에서 생성 한 Swift 헤더 ( “ProductModuleName-Swift.h”) 파일을 가져올 수 있으며 올바른 구현 AnalyticProtocol이 이제 컴파일러에 알려집니다.

이것은 Apple Docs의 “Using Swift from Objective-C”섹션에도 설명되어 있습니다.

XCode는 앞으로 선언 된 프로토콜 ( “AnalyticProtocol에 대한 프로토콜 정의를 찾을 수 없음 ‘)을 사용할 때 objC 헤더 파일에 경고를 표시하지만 무시할 수 있습니다. 구현은 컴파일 타임에 발견됩니다.


답변

단순히 프로토콜을 채택해야하는 모든 사용자를 위해 경고 나 오류를 생성하지 않고 두 단계로 수행 할 수 있습니다.

  1. 당신에 .swift파일 추가, @objc프로토콜 이름 앞에 :

    @objc protocol AnalyticProtocol {
    
    }
  2. 당신에 .m파일을 생성 스위프트 헤더를 가져 오기 및 민간 부문에서 프로토콜을 채택한다. (헤더 파일은 자동으로 이름이 지정됩니다) :

    #import "ProductModuleName-Swift.h"
    
    @interface AnalyticFactory () <AnalyticProtocol>
    
    @end

이것이 Apple에서 권장하는 접근 방식입니다. Objective-C와 Swift의 믹싱 및 매칭에 대한 자세한 내용은 https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html에서 확인할 수 있습니다.


답변

프레임 워크를 만드는 경우 필요한 가져 오기

#import "ProductModuleName-Swift.h"

변경 사항 :

#import <ProductModuleName/ProductModuleName-Swift.h>

이 경우 빠른 프로토콜을 공개 해야합니다 .

@objc public protocol AnalyticProtocol {
  func something();
}


답변

코드를 거의 변경하지 않고 Objective C에서 신속한 프로토콜을 사용할 수 있습니다. 또한 @objc 선언 프로토콜을 사용하면 기본 구현없이 선택적 및 필수 메서드를 사용할 수 있습니다. 장단점이 있습니다.

Objective C에서 사용할 때 실제로 프로토콜 이름을보다 설명적인 이름으로 바꿀 수 있습니다. 저는 “@objc (alias_name)”을 사용합니다.

다음은 코드입니다. ObjC 코드에서 사용할 @objc 속성과 별칭 이름을 사용하는 신속한 프로토콜을 만들어 보겠습니다.

@objc(ObjTableViewReloadable) protocol TableViewReloadable: class {
   func reloadRow(at index: IndexPath)
   func reloadSection(at index: Int)
   func reloadTable()
}

이제 farword가 .h 파일에서 프로토콜을 선언 해 보겠습니다.

@protocol ObjTableViewReloadable;

이제 .m 파일에서이 프로토콜을 준수하고 필요한 메소드 구현을 추가 할 수 있습니다.

#import "MyApp-Swift.h"
@interface MyObjcViewController () <ObjTableViewReloadable>


답변