Swift 코드를 Objective-C로 가져 오려면 어떻게해야합니까?


281

Swift에서 라이브러리를 작성했으며 Objective-C로 작성된 현재 프로젝트로 라이브러리를 가져올 수 없었습니다.

가져 오는 방법이 있습니까?

#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found

9
이 프로젝트를 사랑하십시오!
SleepsOnNewspapers

답변:


430

가져와야 TargetName-Swift.h합니다. 대상 이름입니다. 다른 답변은 클래스 이름을 사용하는 실수를합니다.

이 단일 파일은 주석이 있거나 주석을 @objc받는 프로젝트의 모든 Swift 클래스에 대한 Objective-C 인터페이스를 정의하는 자동 생성 헤더입니다 NSObject.

고려 사항 :

  • 대상 이름에 공백이 포함 된 경우 (예 : 밑줄로 대체 My Project됩니다 My_Project-Swift.h)

  • 대상이 프레임 워크 인 경우 가져와야합니다. <TargetName/TargetName-Swift.h>

  • Swift 파일이 대상의 구성원인지 확인하십시오


5
가져 오기에서 Swift 파일 이름을 사용하려고하면 "예상 ';'오류가 발생합니다. 최상위 선언자 이후 " "가져온 기초"후에 Swift 파일에.
louielouie

8
편집 : 참고 : 이것이 작동하려면 프로젝트 모듈 이름을 정의해야합니다. 참조 : stackoverflow.com/a/24064015/2085743
루벤 마르티네즈 주니어

7
프로젝트 이름에 공백이나 특수 문자가 있으면 밑줄로 바꾸어야합니다. "My App"과 같이 "My_App-Swift.h"
Hola Soy Edu Feliz Navidad

84
이것이 왜 그렇게 어렵고 문서화되지 않은가?
uchuugaka

3
@lelelo 아니오, 그 파일은 이것과 반대입니다. 브리징 헤더는 개발자가 작성하며 Objective-C 및 C 기호를 Swift 코드로 가져올 수 있습니다. Target-Swift.h 파일이 자동으로 생성되어 Objective-C / C 코드가 Swift 기호에 액세스 할 수 있습니다.
Bill

154

Apple 웹 사이트의 지침 :

동일한 프레임 워크에서 Swift 코드를 Objective-C로 가져 오려면

아래 빌드 설정포장 , 확인하게 정의 모듈 이 프레임 워크 대상에 대한 설정이 설정되어 있음 . 이 구문을 사용하고 적절한 이름으로 대체하여 해당 프레임 워크 대상에서 해당 프레임 워크 대상 내의 Objective-C .m 파일로 Swift 코드를 가져 오십시오.

#import "ProductName-Swift.h"

개정:

"ProductName-Swift.h" 는 .m 파일 로만 가져올 수 있습니다 .

대상의 Swift 파일은이 import 문을 포함하는 Objective-C .m 파일에서 볼 수 있습니다.

주기적 참조를 피하려면 Swift를 Objective-C 헤더 파일로 가져 오지 마십시오. 대신, Objective-C 헤더에서 사용하도록 Swift 클래스를 전달할 수 있습니다. Objective-C에서 Swift 클래스를 서브 클래 싱 할 수 없습니다.

여기에 이미지 설명을 입력하십시오


2
.m 파일로 "ProductName-Swift.h"만 가져 오는 것이 도움이되었습니다. .pch 파일에 동일하게 추가하면 " 'CLLocationManagerDelegate'에 대한 프로토콜 선언을 찾을 수 없습니다. 'NSLayoutManagerDelegate'를 의미 했습니까?"
Alphonse R. Dsouza

@AJit 직접하지는 않지만 문서에 나와 있습니다. 가장 쉬운 방법은 Objective-C ++가 이해하는 형식으로 변환되는 Objective-C 클래스를 만드는 것입니다. developer.apple.com/library/ios/documentation/Swift/Conceptual/…
Alejandro Iván

1
NSObject!!! 에서 파생되어야합니다. 당신은 똑바로 class Blah 신속하게 선언하고 작동 시킬 수 없습니다 . 그것은 할 필요가class Blah : NSObject
데이비드 T.에게

가치는 어떤 경우에이 답변을 읽기 : stackoverflow.com/questions/26328034/...을 당신이 무엇을하고 있는지에 따라 : # import를 <제품 이름 / ProductModuleName-Swift.h> # import를 <ProductModuleName-Swift.h> # import를 <NewTestApp / NewTestApp -Swift.h>
inigo333

Swift 확장을 가져 오려면 어떻게합니까?
Ricardo

150

수행 할 작업은 다음과 같습니다.

  1. Objective-C에서 새 프로젝트 작성

  2. .swift파일   만들기

    • 팝업 창이 나타나 물을 것이다 "헤더를 브리징 목표 -C를 구성하고 싶은 당신을" .
    • 예를 선택하십시오 .
  3. Xcode 프로젝트 파일을 클릭하십시오

  4. 빌드 설정을 클릭하십시오

  5. 검색 표시 줄을 찾아 모듈 정의를 검색하십시오 .

  6. 값을 예로 변경하십시오 .

  7. 제품 모듈 이름을 검색 하십시오 .

  8. 값을 프로젝트 이름으로 변경하십시오.

  9. App delegate에서 다음을 추가하십시오. #import "YourProjectName-Swift.h"


참고 : Swift 파일을 사용할 때마다 다음 줄을 가져와야합니다.

#import "YourProjectName-Swift.h"


1
의 값을 변경 Defines moduleBuild settings하는 것은 Yes나를 위해 일을 고정 것입니다!
Zakaria Braksa

포함 된 내용은 Swift를 포함합니다 : 예 이것도 사용
Mohit

4
좋은 답변이지만 7-8 단계는 Xcode 7.3.1 이상에서는 필요하지 않습니다
Sam B

나를 위해 일했다! 감사.
itsdamslife

1
그냥 그 추가 할 YourProjectName의를 #import "YourProjectName-Swift.h"프로젝트 이름에 특수 문자가 포함 된 경우 유용한 8 단계에서 프로젝트의 이름이됩니다 그리고 당신은 당신이 포맷하는 방법을 정확히하지 않습니다.
척 보리스

40

Cocoapods를 사용하고 ObjC 프로젝트에서 Swift 포드를 사용하려는 경우 간단히 다음을 수행 할 수 있습니다.

@import <FrameworkName>;

여기에 이미지 설명을 입력하십시오


1
고마워요! 당신은 내 하루를 구했다.
Esha

Cocoapods를 통해 신속한 라이브러리를 설치하면 매력처럼 작동합니다. 공감!
NSPratik

21

프로젝트 파일에서 빌드 설정으로 이동하여 "Objective-C Generated Interface Header Name"을 검색 하십시오 . 해당 특성의 값은 포함해야하는 이름입니다.

"제품 모듈 이름"속성 (위의 속성이 기본적으로 의존하는 속성)이 테스트 / 디버그 / 릴리스 / 등 (내 경우와 같이)에 대해 컴파일하는지에 따라 달라지는 경우이 속성을 해당 속성과 독립적으로 만드십시오. 사용자 정의 이름을 설정하여 변형.


15

Swift파일을 제대로 가져 Objective-c오지 않으면 파일을 가져 오면 이 오류가 발생할 수 있습니다 import.

참고 : Swift 파일을 외부로 가져올 필요는 없으며 신속한 파일을 처리하는 파일 하나만 가져와야합니다.

Objective-C 프로젝트 내에 Swift 파일작성 / 복사 한 경우 . 브리징 헤더를 자동으로 생성했을 것입니다.

확인 Objective-C Generated Interface Header NameTargets -> Build Settings.

여기에 이미지 설명을 입력하십시오

위의 내용에 KJExpandable-Swift.h따라 그대로 가져옵니다 .

귀하의가 될 것입니다 TargetName-Swift.h경우, TargetName프로젝트 이름 또는 다른 대상에 따라 다릅니다은 추가하고 그것을 실행했을 수 있습니다.

아래의 목표는입니다 KJExpandable.KJExpandable-Swift.h
여기에 이미지 설명을 입력하십시오


12

첫 번째 단계:-

프로젝트 대상-> 빌드 설정-> 검색 ( '정의')-> 모듈 업데이트 값 정의 아니오예로 선택하십시오.

"정의 모듈": YES .

"항상 Swift 표준 라이브러리 임베드": .

"Objective-C 호환성 헤더 설치": .

여기에 이미지 설명을 입력하십시오

두번째 단계:-

아래와 같이 Objective C ".h"파일에 Swift 파일 클래스 추가

#import <UIKit/UIKit.h>

@class TestViewController(Swift File);

@interface TestViewController(Objective C File) : UIViewController

@end

목표 C ".m"파일에서 'ProjectName (귀하의 프로젝트 이름) -Swift.h'가져 오기

//TestViewController.m 
#import "TestViewController.h"

/*import ProjectName-Swift.h file to access Swift file here*/

#import "ProjectName-Swift.h"

클래스의 전달 선언 (@class)은 매우 좋은 지적입니다! 감사!
Philipp Otto

10

동일한 프레임 워크 내에서 Swift 코드를 Objective-C 파일로 가져 오는 경우 한 가지주의 할 점이 있습니다 . 프레임 워크 이름과 꺾쇠 괄호를 지정하여 수행해야합니다.

#import <MyFramework/MyFramework-Swift.h>

MyFramework다음은 "제품 모듈 이름"빌드 설정 ( PRODUCT_NAME = MyFramework)입니다.

단순히 추가 #import "MyFramework-Swift.h"하면 작동하지 않습니다. 빌드 된 제품 디렉토리를 확인한 경우 (이러한 #import추가 되기 전에 대상에 일부 Swift 코드가있는 빌드가 하나 이상 성공한 MyFramework-Swift.h경우) Headers디렉토리에 파일이 계속 표시됩니다 .


8

Swift 4에서 프로젝트를 만든 다음 Objective-C 파일을 추가 한 경우 다음과 같이하십시오.

@objcMembers
public class MyModel: NSObject {
    var someFlag = false         
    func doSomething() {         
        print("doing something")
    }
}

참조 : https://useyourloaf.com/blog/objc-warnings-upgrading-to-swift-4/


내 코드에서, 나는 그것은 작동하지 않습니다 신속 3.에서 스위프트 4.2로 업데이트 후
SNarula

어떤 오류가 발생합니까? Swift4.2에서 위의 코드를 사용했으며 정상적으로 작동합니다.
Prashant Bhayani

좋아 그거 좋군.
Prashant Bhayani

4

동일한 프로젝트에서 Swift 및 Objective C에 대한 시험판 노트 확인

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-XID_75

가져와야합니다

#import "SCLAlertView-Swift.h"

3
이 오류가 표시되었습니다 : 'SCLAlertView-Swift.h'파일을 찾을 수 없습니다.
Viktor Radchenko 2016 년

2
파일 이름이 아닌 프로젝트 이름이어야합니다-내 대답을 참조하십시오.
Bill

1
설명서 링크에 감사드립니다. 그것은 참조에 유용했습니다.
louielouie

2
제공된 링크에서 인용하자면, The name of this header is your product module name followed by adding "-Swift.h".그것은 여러분이 작성한 클래스 이름이 아니라 제품 모듈의 이름이며 특정 파일뿐만 아니라 모든 신속한 파일을 가져 오는 것을 처리합니다
Chris

4

검색 "인터페이스 헤더 이름 생성 된 목표 - C" (의 그것을 말할 수 있도록 당신이 구축을 위해 노력하고있는 대상의 빌드 설정에서 MyApp-Swift.h),이 설정 (값 가져 #import "MyApp-Swift.h"액세스하려는 경우 소스 파일을) Swift API.

이 필드의 기본값은 $(SWIFT_MODULE_NAME)-Swift.h입니다. "Objective-C Generated Interface Header Name"설정의 값 필드를 두 번 클릭하면 볼 수 있습니다.

또한 모듈 이름에 대시가있는 경우 (라고 가정 My-App하십시오) $(SWIFT_MODULE_NAME)모든 대시에서 밑줄로 바뀝니다. 그런 다음을 추가해야합니다 #import "My_App-Swift.h".


승인 된 것보다 낫습니다. 대시는 20 분을 낭비했는데 나는 다시 하하를 다시는 얻지 못할 것이다.
Roi Mulia

3

당신이 사용하려는 경우 스위프트 에 파일 오브젝티브 C의 이후 당신이 단계 아래에 따를 수 Xcode를 8에서, 그래서 클래스를 :

Objective-C에서 프로젝트를 작성한 경우 :

  1. 새 스위프트 파일 만들기
  2. Xcode는 Bridge-Header 파일 을 자동으로 프롬프트 합니다
  3. 그것을 생성
  4. Objective-C 컨트롤러에서 "ProjectName-Swift.h"를 가져옵니다 (인터페이스가 아닌 구현에서 가져 오기) (이름 사이에 공백이있는 경우 밑줄 "Project_Name-Swift.h"사용)
  5. Swift에서 Objective-C 클래스에 액세스 할 수 있습니다.

그것을 컴파일하면 x86_64 또는 armv 7 아키텍처의 이전 파일 (2.0)보다 최신 버전의 Swift 언어 (3.0)로 컴파일됩니다.

당신의 하나 더 변경

  1. Xcode-> 프로젝트-> 대상-> 빌드 설정-> 레거시 스위프트 언어 버전 사용-> 예

빌드하고 실행하십시오.


1
레거시 스위프트 언어 버전을 사용하는이 옵션을 얻지 못했습니다
rd_

1

대시와 밑줄에주의하십시오. 대시와 밑줄은 혼합 될 수 있으며 프로젝트 이름과 대상 이름은 SWIFT_MODULE_NAME과 동일하지 않습니다.

대시와 밑줄



-1

프로젝트 내에서 .PCH 파일을 찾으십시오. 다음 추가 #import "YourProjectName-Swift.h"클래스 헤더를 가져옵니다이 있습니다. 따라서 특정 파일로 가져올 필요가 없습니다.

#ifndef __IPHONE_3_0
#warning "This project uses features only available in iPhone SDK 3.0 and later."
#endif


#ifdef __OBJC__
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    #import "YourProjectName-Swift.h"
#endif
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.