라는 AnalyticProtocol
Objective-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 헤더 파일에 경고를 표시하지만 무시할 수 있습니다. 구현은 컴파일 타임에 발견됩니다.
답변
단순히 프로토콜을 채택해야하는 모든 사용자를 위해 경고 나 오류를 생성하지 않고 두 단계로 수행 할 수 있습니다.
-
당신에
.swift
파일 추가,@objc
프로토콜 이름 앞에 :@objc protocol AnalyticProtocol { }
-
당신에
.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>