Project-Swift.h를 Objective-C 클래스로 가져 오기… 파일을 찾을 수 없습니다


128

Objective-C에서 시작한 프로젝트가 있는데 이전에 Objective-C를 작성한 것과 동일한 클래스 파일로 일부 Swift 코드를 가져 오려고합니다.

나는 애플 참조하지 않은 문서를 같은 프로젝트뿐만 아니라 SO의에서 스위프트와 목표 - C를 사용하는 방법에 대한 질문 과 같은,하지만 여전히 아무 소용이 : 나는 퍼팅 후 오류를 발견하지 않는 파일을 가져 계속 #import "NewTestApp-Swift.h"( NewTestApp제품의 이름입니다 및 모듈).

여기 내가 지금까지 한 일이 있습니다.

  1. 에서가 Define Modules선택한 YES응용 프로그램에 대한.
  2. 제품 모듈 이름에 공백이 없는지 확인하십시오 (아래 질문 스크린 샷 참조).

내가 사용하는 시도 #import "NewTestApp-Swift.h"내부를 ViewController.m, ViewController.h그리고 AppDelegate.m하지만 그들 중 누구도 일을하지 않았다.

내가 뭘 잘못하고 있니? 당신의 도움을 주셔서 감사합니다.


설정 스크린 샷 :

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


현재 발생하는 오류 :

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


3
모든 파생 데이터를 삭제 ~/Library/Developer/Xcode/DerivedData하여 속임수를 쓰십시오.
wzhang84

다음은이 문제를 해결 한 방법입니다. stackoverflow.com/a/45338549/8102549
schrulnz

답변:


158

같은 문제가 발생하여 프로젝트를 obj-c 클래스로 신속하게 가져올 수 없었습니다. Xcode 6을 사용하면 (Xcode 6+에서 작동해야 함) 이런 식으로 할 수있었습니다 ....

  1. .h 파일에서 액세스해야하는 모든 클래스는 다음 과 같은 전달 선언이어야합니다.

@class MySwiftClass;

  1. .m 파일에서만 코드가 동일한 프로젝트 (모듈)에있는 경우 코드를 가져와야합니다.

#import "ProductModuleName-Swift.h"

Apple 문서에 대한 링크

https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_swift_into_objective-c


3
답변 해주셔서 감사합니다. 그것은 나를 올바른 방향으로 이끌었습니다. 나는 같은 문제가 있었지만 프로토콜에 따라 헤더 파일에서 가져 오기 대신 @protocol MySwiftProtocol을 추가해야했습니다.
palme

.h 파일에서 .h 파일을 중요시하지 않고 클래스의 선언을 선언하면 나에게 속임수가되었습니다. 감사합니다
Sikander

1
제품 이름에 -문자가 있으면 생성 된 헤더 파일의 이름이로 변환됩니다 _. 예를 들어 제품 이름이 My-App이면 가져옵니다 My_App-Swift.h.
dvanoni

1
올바른 생성 헤더 파일 이름을 찾는 새로운 방법을 찾았습니다. 대상으로 이동-> 빌드 설정-> 키워드 검색Objective-C Generated Interface Header Name 빙고!
Itachi

2
나는이 두 가지를 모두했지만 여전히 같은 문제가 있습니다. 주문과 관련이 있다고 생각하십니까?
ArielSD

83

Swift 코드가 모듈 내부에있는 경우 (예 :)

#import <ProductName/ProductModuleName-Swift.h>

Swift 코드가 프로젝트 내부에있는 경우 (Swift와 ObjC 혼합) :

#import <ProductModuleName-Swift.h>

귀하의 경우 * .m 파일에 다음 줄을 추가해야합니다.

#import <NewTestApp/NewTestApp-Swift.h>

중요 : import 문에서 "<"를보십시오

https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html


@ ikocel1에 답변 해 주셔서 감사합니다. 불행히도 이것들은 작동하지 않았습니다. 나는의 변화를 시도했다 <NewTestApp-Swift/NewTestApp-Swift.h>, <NewTestApp/NewTestApp-Swift.h><NewTestApp/ViewController-Swift.h>모든 내부 ViewController.m하지만,에도 불구하고, 오류은 "파일을 찾을 수 없습니다"가 계속 Cleaning조합을 시도한 후 프로젝트마다. 도움이 될 수 있도록 질문 본문에 스크린 샷을 포함 시켰습니다.
daspianist

아직 Swift 코드를 아직 입력하지 않았습니다 ViewController.m. Swift 코드를 수락하기 위해 헤더를 먼저 가져 오려고했습니다. Objective-C와 Swift 코드를 혼합하여 일치시킬 것입니다 ViewController.m.
daspianist

1
동일한 파일에 objc 코드와 신속한 코드를 직접 혼합하는 것이 가능한지 모르겠습니다.
ikocel1

1
고마워, 이것은 내가 애플의 "Mix and Match"문서를 기반으로 한 가정이라고 생각합니다. 그러나 실제 파일 안에는없는 것 같습니다. 감사합니다!
daspianist

6
이 답변이 승인 된 이유를 모르겠습니다. 예, 문서를 따르는 것이 정확하지만 실제로 나에게도 효과가 없습니다. 질문에서도 사용자 가이 답변에서 권장되는 구문을 사용하지만 여전히 오류가 발생한다는 것은 분명합니다.
다리우스 Miliauskas

54

객관적인 c로 신속하게 가져 오는 방법 :

  • 모듈 이 YES로 설정 됨 (프로젝트에서-대상이 아님)
  • 제품 모듈 이름이 설정 됨 (대상에서-프로젝트가 아닌)
  • ViewController.m에서 다음을 사용하여 빠른 코드를 가져옵니다.

    #import "MyProductModuleName-Swift.h"
  • objective-c 프로젝트에 빠른 파일을 추가하면 (File-> New-> Swift) Xcode는 objective-c에서 Swift로 브리징 헤더 를 만들지 만 다른 방법으로도 작동하도록하는 것이 중요 합니다.

실제로 Xcode의 GUI를 통해 신속한 파일을 추가하고 단지 드래그하지 그것을 만들기위한 나의 프로젝트에 기존의 신속한-파일을 삭제의 나를 알고 만들기위한 Swiftoverload이 퍼즐 덕분에 마지막 조각을 위해 일 : http://nikolakirev.com/blog / using-swift-in-objective-c-project


훌륭한 메모. 테스트 대상은 자체 모듈이며 "<#TestTargetName #>-Swift.h"라는 자체 헤더를 가지며 대상 이름의 공백은 공백으로 변환됩니다.
Chuck Krutsinger

@ holm51이 질문에 대해 죄송하지만, 어디에 Define Module있으며 Product Module Name?
matchifang

-이름의 대시도 밑줄 _로 변환됩니다
CyberMew

11

Xcode 8.2.1을 사용하고 Project > Build Settings> Objective-C Generated Interface Header Name 을 보면 Product 와 같은 이름의 헤더 파일이 하나만 표시 됩니다. -Swift.h

즉, 개별 -Swift.h 파일을 사용하여 Objective-C .m 파일과 별도로 각 모듈을 가져 오는 대신 하나의 제품 만 가져옵니다. 모든 Swift 모듈을 집계 -Swift.h를 .

모듈을 개별적으로 가져 오는 전통적인 방법을 찾아서 같은 문제가 발생했지만 현재 버전의 Xcode 및 Swift 3는 모든 모듈 가져 오기에 대해 하나의 헤더 만 사용하도록 변경했습니다.


안녕 피터,이 파일을 어디서 찾을 수 있습니까? 아니면 xcode에 의해 자동 생성됩니까? 또한이 변경으로 인해 podfile을 다르게 설정해야합니까?
Rob Norback

@RobNorback 내가 틀리지 않으면 Obj-C 헤더 / 구현 파일에 'import-Product-Swift.h'를 작성하여 추가 작업없이 효과를 볼 수 있습니다. 프로젝트 설정에 Swift 및 Obj-C 믹싱에 대한 모든 구성이 활성화되어 있는지 확인하십시오. 또한 여전히 Podfile에 문제가 발생하지 않았습니다. 내가 다르게 보는 것을 알려주세요.
petershine

감사합니다.이 문제를 디버깅하는 데 몇 시간을 보냈으며 실제로 프로젝트의 각 모듈이 자체 -Swift.h헤더 파일을 생성하고 있다는 것이 문제였습니다 . 공통 헤더 파일을 사용하도록 모든 대상 (5 개의 대상이 있음)을 강요하면 문제가 해결되었습니다.
Apoorv Khatreja

@ApoorvKhatreja 어떻게 그렇게 했습니까? 파일 이름을 명시 적으로 썼습니까?
Ramit

8

이 문제에 대해 한 시간을 보냈습니다. 다음 단계를 따르면 누락 된 사항을 이해하는 데 도움이됩니다.

  1. Xcode 환경 설정을 열고 DerivedData 폴더로 이동하십시오.
  2. 파인더에서 "swift.h"검색
  3. project-swift.h 파일을 찾을 수 없으면이 파일이 생성되지 않은 것입니다. 일반적으로 빠른 클래스 중 하나에 @objc를 추가하고 앱을 성공적으로 빌드해야합니다. 그러면 Xcode 가이 파일을 생성합니다
  4. "xxx-swift.h"파일을 찾았다면, 수입 명세서에 정확한 이름이 포함되어 있는지 확인하십시오.

위치를 찾는 빠른 파일


여러 질문에 동일한 답변을 추가하지 마십시오 . 충분한 평판을 얻으면 가장 좋은 것에 대답하고 나머지는 중복으로 표시하십시오. 복제본이 아닌 경우 게시물을 질문에 맞게 조정하고 삭제를 위해 플래그를 지정하십시오.
Bhargav Rao

감사합니다! 내 앱의 표시 이름 (대상이 아닌)과 Swift 헤더 이름도 변경했습니다. 이것이 내가 진행중인 것을 찾을 수있는 유일한 방법이었습니다.
Lucas P.

답변을 게시 해 주셔서 감사합니다. 스크린 샷과 정확한 포인트 형식으로 즉시 뒤로 스크롤하고 + 검색 + 종료했습니다 ... 문제가 해결되었습니다!
dklt

6

Swift를 Objective-C 프로젝트로 가져 오는 데 문제가있었습니다. 결국 Derivied Data 폴더를 살펴보고 Xcode 7이 무엇을 생성하고 있는지 확인했습니다. 파일 이름은 내가 예상했던 것과 완전히 다릅니다.

실제 파일 이름을 가져 오면 가져와 프로젝트를 빌드 할 수 있습니다.


2
이 파일은 어디에 있습니까? 나는 주위를 둘러보고 아무것도 찾을 수 없습니다
Amit Raz

5

-Swift.hSwift 코드가 @objc또는 [정보] 를 통해 API를 노출하는 경우 Xcode에서 자동으로 생성해야합니다 @objcMembers.

일반적으로 위치는 다음과 같습니다

~/Library/Developer/Xcode/DerivedData/
  ProductModuleName-foo/
    Build/
      Intermediates.noindex/
        ProductModuleName.build/
          Debug-iphoneos/
            ProductModuleName.build/
              DerivedSources/
                ProductModuleName-Swift.h

에 의해 변경 될 수 있습니다

Project editor -> select a target -> Build Settings -> Per-configuration Intermediate Build Files Path

기본적으로 값은 $(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)


2

DEFINE MODULES : YES 및 Obj-C 클래스의 .m 파일에서 "ProjectName-Swift.h"가져 오기

이것은 Obj-c의 Swift 클래스에 액세스하는 데 효과적이었습니다.


3
그러나 objc 헤더에 빠른 클래스가 필요한 경우 .h 파일로 가져 오는 방법은 무엇입니까?
Alexander Danilov

1

git을 사용하여 프로젝트를 수행 할 때 팀과 동일한 문제에 직면했습니다. 한 개발자가 최신 Swift 2.2 버전에 필요한 최신 버전 (7.3)으로 Xcode를 업데이트하지 않았습니다. 따라서 컴파일러는 새로운 Swift 구문을 인식하지 못했으며 Swift 라이브러리 (projectname-swift.h)에 대한 인터페이스를 생성 할 수 없습니다. Xcode 버전이 최신 버전인지 확인하십시오!


Xcode에서 제공하는 Swift 3으로 마이그레이션을 연기하기로 결정했기 때문에 문제가 발생했습니다. 결과적으로 Xcode는 Swift 소스 파일을 만들 수 없었고 포함 할 헤더를 생성하지 않았습니다.
iutinvg

1

개발 중에 구문 오류가있을 수 있으므로 완전히 구현되지 않은 신속한 클래스가있을 수 있습니다. 신속한 헤더 파일은 모든 신속한 파일에 오류가없는 경우에만 사용할 수 있습니다.

신속한 파일에 구문 오류가 없는지 확인한 다음 목표에서 신속한 헤더를 가져 오십시오.-c 파일


1

헤더 파일 가져 오기

#import "<ProjectName>-Swift.h" 

.h 파일 내에서 다음과 같은 오류가 발생했습니다.

-Swift.h '파일을 찾을 수 없습니다

빌드가 실패했습니다.

대신 다음을 사용하십시오.

#import "<ProjectName>-Swift.h"

.m 파일 내에서 동일한 오류가 발생하더라도 프로젝트를 실행하면 오류가 억제됩니다.

그런 다음 빠른 클래스를 .m 파일에서 사용할 수 있습니다.


1

프로젝트 이름 (대상)에 문제가 있습니다. "-"기호가 포함되었습니다. 따라서 결정은 다음입니다. 프로젝트 이름이 "Test-App"이면 가져온 클래스 이름은 "Test_App-Swift.h"입니다.


최상의 솔루션
iOS Lifee

1

앱 이름에 특수 문자가 있으면 특수 문자에 _를 사용하십시오.

예를 들어 앱 이름이 "Test App®"인 경우

그런 다음 "Test_App_-Swift.h"로 빠른 파일을 가져올 수 있습니다.

가져 오는 동안 Space 및 ®는 _로 바뀝니다.


0

대상이 여러 개인 경우 모든 프레임 워크를 빌드했는지 확인하십시오.


0

Xcode 11

Xcode 11에서 빌드 할 때이 문제가 발생했습니다. 무엇이 잘못되었는지 알아 냈지만 본질적으로 대상의 "일반"탭에서 "표시 이름"설정을 변경했습니다. Info.plist 했습니다. 대상의 "정보"탭.

이로 인해 Xcode 11.5는 많은 새로운 사용자 정의 빌드 설정을 다시 작성 / 작성하고 앱 모듈 및 빌드 된 .app 제품의 이름을 수정했습니다. 이 경우 새 표시 이름에는 슬래시 ( /) 문자도 포함되어있어 최종적으로 빌드되지 않은 이유 일 수 있습니다 ( @Silversky Technology답변 참조 ).

어쨌든, 나는 프로젝트 파일에 대한 모든 Xcode 11.5의 자동 변경을 취소하고 수동으로 번들 표시 이름을 동일하게 변경 하여이 문제를 해결했습니다. Info.plist 모든 것이 완벽하게 작동합니다.

나는 그것이 전에 일어나서 당신의 동의없이 그것을하고 있다고 말하고 싶습니다.


0

신속한 클래스에 공개 선언이 있는지 확인하고 NSObject를 확장하십시오.

public class MySwiftClass: NSObject {
    //...
}

신속한 클래스가 동일한 프로젝트에있는 경우 가져 오기는 괄호가 아닌 따옴표로 작동해야합니다.


0

Swift File을 먼저 추가하는 경우 왼쪽 열에서 대상에 빠른 파일을 추가하는 것을 기억하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.