Objective-C 클래스에서 Swift 프로토콜 가져오기
스위프트 프로토콜이라는 이름을 가져오려고 합니다.AnalyticProtocol
목표-C 클래스로 지정됩니다.AnalyticFactory
.
protocol AnalyticProtocol
{
}
저는 기존 Objective-C 프로젝트에서 시작합니다(xCode로 새 Swift 프로젝트를 만들지 않았고 Objective-C 프로젝트를 xCode 6에서 Swift 프로젝트로 구성하는 방법을 찾을 수 없었습니다).
내 스위프트 파일에 포함된 것은.h
파일명MyProjectName-Swift.h
컴파일러가 존재하지 않는다는 오류를 반환했습니다.그래서 저는..h
파일명MyProjectName-Swift.h
실제로는 비어 있습니다. (무엇을 넣어야 할지 모르겠습니다.)
애플 문서에서 그들은 내가 내 것을 포함해야 한다고 말했습니다..h
파일명MyProjectName-Swift.h
내 안에.m
파일입니다. 하지만 제 파일에 포함시킬 필요는 없습니다..m
줄을 세워서 내 안으로.h
. 이것이 문제가 될 수 있습니까?
컴파일하려고 하면 다음 오류가 발생합니다. :0: 오류: xxxAnalyticFactory.h:39: 'Analytic Protocol'에 대한 프로토콜 선언을 찾을 수 없습니다.
그리고 범죄자 코드는:
@interface AnalyticFactory : NSObject
{
Class<AnalyticProtocol> _analyticProtocolClass; // The type of the analytic class currently used.
}
어떻게 스위프트 프로토콜을 Objective-C 클래스로 가져올 수 있는지 잘 이해가 되지 않는 것 같습니다.
제가 하고 있는 일에 오류가 있는 사람이 있습니까?
당신은 추가할 필요합니다.@objc
다음과 같이 Swift 프로토콜에 속성을 부여합니다.
@objc protocol AnalyticProtocol {
}
Xcode 생성 Swift 헤더를 objC 헤더 파일로 가져올 수 없습니다.
따라서 objC 헤더 파일에서 Swift 코드를 사용하려면 다음과 같이 objC 헤더 파일에서 사용할 클래스와 프로토콜을 "forward declarate"해야 합니다.
@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
이제 컴파일러에게 알려질 것입니다.
이는 Swift를 목표-C로 공식 Importing(Importing Swift into Objective-C)에도 설명되어 있습니다.
정방향 선언 프로토콜("Analytic Protocol'의 프로토콜 정의를 찾을 수 없습니다")을 사용할 때 XCode가 objC 헤더 파일에 경고를 주지만, 이는 무시될 수 있습니다. 컴파일 시 구현이 발견됩니다.
단순히 프로토콜을 채택하기만 하면 되는 모든 사용자를 위해 경고나 오류 없이 두 단계로 수행할 수 있습니다.
당신의
.swift
파일, 추가@objc
프로토콜 이름 앞에:@objc protocol AnalyticProtocol { }
의 에
.m
파일, 생성된 Swift 헤더를 가져온 후 프로토콜을 개인 카테고리로 채택합니다. (헤더 파일 이름은 자동으로 지정됩니다):#import "ProductModuleName-Swift.h" @interface AnalyticFactory () <AnalyticProtocol> @end
이것이 애플이 권장하는 방법입니다.Objective-C와 Swift의 혼합 및 매칭에 대한 자세한 내용은 여기 https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html 에서 확인할 수 있습니다.
우리는 코드 변경이 거의 없는 목표 C에서 신속한 프로토콜을 사용할 수 있습니다.또한 @objc 선언 프로토콜을 사용하면 기본 구현 없이 선택적이고 필수적인 방법을 사용할 수 있습니다.그것은 장단점이 있습니다.
목표 C에서 사용할 때 프로토콜 이름을 좀 더 설명적으로 변경할 수 있습니다.저는 "@objc(alias_name)"를 사용합니다.
여기 코드, ObjC 코드에서 사용할 @objc 속성과 별칭 이름을 가진 swift protocol을 갖겠습니다.
@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>
프레임워크를 생성하는 경우 필요한 가져오기
#import "ProductModuleName-Swift.h"
변경 내용:
#import <ProductModuleName/ProductModuleName-Swift.h>
이 경우 swift protocol을 공개해야 합니다.
@objc public protocol AnalyticProtocol {
func something();
}
언급URL : https://stackoverflow.com/questions/24078242/importing-a-swift-protocol-in-objective-c-class
'programing' 카테고리의 다른 글
WordPress의 편집기에 관리 전용 하위 메뉴 링크를 표시합니다.오류가 발생합니다. (0) | 2023.10.04 |
---|---|
$parse 대 $eval ? 어떤 것이 최선의 방법입니까? (0) | 2023.10.04 |
AngularJS Reference Error: $window가 정의되지 않았습니다. (0) | 2023.10.04 |
C에서 구조물의 정적 배열 초기화 (0) | 2023.10.04 |
입력 루프에 주조 입력 (0) | 2023.10.04 |