Xcode 6에서 신속하지 않은 Objective-C 헤더로 생성


242

나는 최근에 실제 프로젝트로 시험해보기 위해 기존 프로젝트에 Swift를 추가하려고 노력하고 있습니다.

Swift 소스 파일을 프로젝트에 추가 할 때 "Bridging Header", 즉 Objective-C to Swift를 얻는 데 아무런 문제가 없습니다.

그러나 *-Swift.hSwift 클래스를 표시 @objc하거나 ObjC 클래스의 하위 클래스를 노출 해야하는 헤더 파일은 찾을 수 없습니다.

Swift로 작성된 새로운 하위 클래스를 주 응용 프로그램 코드 (여전히 Objective-C)로 사용하는 방법에 대한 구체적인 지침은 없습니다.

내가 리드 개발자 인 앱에는 상당히 큰 코드베이스 (70.000 줄)가 있으므로 한 번에 전환하면 문제가 발생하지 않습니다.


5
그렇습니다. Swift 코드를 기존 ObjC 프로젝트에 추가 할 때 "기본적으로"발생하지 않기 때문에 XCode IDE에서이 Swift-> ObjC를 생성하기 위해 어떤 작업을 수행해야하는지 실제로 묻습니다.
David Kristensen 2016 년

5
@Popeye 동의하지 않습니다. 이 경우 파일을 편집하고 명령 줄에서 컴파일하는 경우이 문제가 표시되지 않습니다. 문제가되는 사용자를 대신하여 수행하거나 수행해야하는 IDE입니다. 프로젝트 설정과 관련이있을 가능성이 높습니다. IDE 기능입니다.
gaige

11
@Popeye 문서에서 (PDF) : Swift 코드를 Objective-C로 가져 오는 경우 Xcode 생성 헤더 파일을 사용하여 해당 파일을 Objective-C에 노출합니다. (내 대담한, 애플의 이탤릭체) 이것은 Swift와 Objective-C를 함께 사용하는 데 도움이되는 Xcode의 기능에 관한 질문이며 분명히 세 가지 태그가 모두 적절합니다.
Caleb

3
gaige와 문서의 도움으로 해결했습니다. 그리고 나는 단지 태그를 던지지 않습니다.이 경우 헤더 파일은 XCode에 의해 생성되고 볼 수 있어야합니다. 그렇지 않아 오류가 발생했습니다.
David Kristensen 2016 년

3
@Popeye 잃어버린 것은 없습니다. 46 쪽에서 직접 인용문을 복사했습니다. 비슷하지만 다른 구절을 발견했습니다.
Caleb

답변:


165

이제 작동합니다.

  1. 프로젝트 에는 공백 이 없는 제품 모듈 이름이 있어야합니다 .
  2. 정의 모듈 로 설정해야합니다 포장에서, 빌드 설정에서.

마침내 작동합니다. 도움을 주신 모든 분들께 감사드립니다 :-)


64
에서 Build Settings아래 Packaging, 내가 Defines Module로 설정 Yes하고 난을 만들어 Product Module Name공백없이. "* -Swift.h"는 XCode 6에 의해 생성되지 않습니다. ???
Loozie

25
한 가지 추가 참고 사항 : 먼저 대상 수준에서 언급 된 속성을 설정하려고 시도했지만 작동하지 않아 "* -Swift.h"파일이 생성되지 않았습니다. 프로젝트 수준에서 설정했을 때 효과가있었습니다.
Marcin

22
나는 또한 같은 문제가 있습니다. 프로젝트와 대상 및 공백없이 정의 된 것으로 Defines Module설정 했지만이 파일을 생성 할 수없는 것 같습니다. YesProduct Module Name
Craig Otis

8
다른 사람들이 내가했던 것처럼 혼란스러워하는 경우를 대비하여 ... 여기에 눈먼 운이 있어야하고 자동 완성되지 않으므로 헤더를 가져와야했습니다.
shawnwall

14
구현시에만 헤더 파일 (.h)에서 -swift를 가져올 수 없습니다.
zirinisp

122

비슷한 문제가 있었고 추가 할 수 있다는 것을 알았습니다.

#import "ProductModuleName-Swift.h"

우산 헤더를 찾을 수 있도록 .h 파일이 아닌 obj-c .m 파일로


2
이것은 정확합니다 ... objc 헤더에 Swift 클래스를 사용해야하는 경우 어떻게해야합니까? 전달 선언으로 시도했지만 작동하지 않습니다.
Ixx

2
죄송합니다, 앞으로 선언이 작동합니다. 세미콜론을 추가하는 것을 잊었습니다. : P
Ixx

14
향후 검색 자 : 헤더에서 .h 파일 맨 위에서 @class YourSwiftClass를 수행하여 선언을 전달하십시오 (우산 헤더를 가져 오는 대신)
rogueleaderr

4
헤더 파일에 Swift 열거 형을 사용해야하는 경우 어떻게합니까?
jakecraige

1
또한 "#import ProductModuleName-Swift.h"가 헤더 파일에 있으면 ProductModuleName-Swift.h 파일이 전혀 생성되지 않습니다 (예 : 빌드를 정리하여 Xcode 7.2 기준). ) 파일을 가져 오는 모든 곳에서 오류 메시지가 표시됩니다.
르네

59

파일을 생성하기 전에 모든 빌드 오류 를 수정해야한다는 것을 알았습니다 .

나를위한 문제는 실제로 닭고기 / 계란 문제라는 것이 었습니다 #import.

//#import "ProductModuleName-Swift.h"

내 Swift 코드에 다른 많은 오류가 나타났습니다.

이 새로운 오류를 수정하고 소스 구축을 성공적으로 마치면 #import및 빙고의 주석 처리를 제거했습니다 ! 헤더가 작성되어 올바르게 가져 오기 :)


고마워, 이것이 나를 붙잡고 있었던 것입니다. 신속한 빌드 오류를 수정 한 후에는 좋았습니다. (Xcode 버전 6.1.1)
Rick Roberts

10
이것은 Xcode에서 "오류 후 빌드 계속"설정을 켜야하는 좋은 이유입니다.
Kendall Helmstetter Gelner

그것도 내 경우 정확히 : 실종 -Swift-H는 빠른 소스 코드에서 동일하게 변경 한 후 무슨 일이 있었
조르지오 Calzolato

3
닭고기 / 계란 문제를 보고 난 후 내 문제를 잘 알고있다
d0ye

이 문제는 항상 나에게 돌아 왔고 (Xcode10) Xcode를 버그로 해석했습니다. 이것은 정답입니다
SumakuTension

44

당신이 나와 같다면 아마도 헤더 이름이 잘못되었을 것입니다. 잠시 동안 내 머리를 강타한 후 DerivedData에서 파일을 찾고 충분히 있는지 확인했습니다. 내 설정에서 (표준 파생 데이터 폴더 사용)

cd ~/Library/Developer/Xcode/DerivedData
find * -iname '*Swift.h'

찾을 것입니다. 해당 폴더의 어떤 것도 일치하지 않으면 Xcode가 생성하지 않습니다.

Xcode 버전 6.2 (6C86e)를 사용하고 있습니다


이것은 나를 위해 그것을했다. 나는 자동 완성이 내가 거기에 없다고 가정했을 때 그것을 선택할 것이라고 생각했습니다. 디렉토리를 보면 문제가 해결되었습니다.

때때로 보는 것은 믿는 것입니다. 권장 답변을 따를 때까지 작업을 수행 할 수 없었고이 단계를 사용하여 놀랍게도 -Swift.h실제 Swift 파일의 이름이 아닌 접미사가있는 생성 된 헤더를 찾았습니다 . 감사합니다!
Josh Habdas 2016 년

감사! 나에게 많은 시간 저장된
estemendoza을

43

프로젝트 모듈 이름에 공백이 있다면, 당신은 해야한다 밑줄 공간을 대체합니다.

예를 들어 프로젝트 이름이 "My Project"인 경우 다음을 사용합니다.

#import "My_Project-Swift.h"


12
프로젝트 모듈 이름에 하이픈이 있으면 밑줄로 바꿔야합니다. 프로젝트 이름이 "My-Project"인 경우 #import "My_Project.h"를 사용하십시오
Jeff Ames

6
또한 프로젝트 모듈 이름이 숫자로 시작하면 밑줄로 바꿔야합니다. "1st Project"는 "_st_Project-Swift.h"
Danation 2015 년

31

* 중요한 것은 : *

대상에 정의 된 "제품 모듈 이름"을 사용한 후 -Swift.h

#import <Product Module Name>-Swift.h

// in each ObjectiveC .m file having to use swift classes
// no matter in which swift files these classes sit.

"모듈 정의"매개 변수가 예 또는 아니오로 설정되어 있거나 "제품 모듈 이름"프로젝트가 설정되지 않은 경우에 관계없이.

주의 : ObjectiveC / Foundation에 노출 되려면 스위프트 클래스가 NSObject에서 파생되거나 @objc 속성으로 태그되어야합니다. 코코아 ...


1
사실입니다 : 프로젝트 또는 대상에서 "정의 모듈"필요 없음
Giorgio Calzolato

25

Swift와 Objective-C 코드가 혼합 된 프레임 워크를 만들고 있었 으므로이 문제를 발견 할 수있는 또 다른 이유를 추가하고 싶었습니다. 프레임 워크 외부에서 Swift 클래스를 가져올 수 없었습니다. -Swift.h 파일을 확인했는데 파일이 생성되었지만 비어있었습니다.

문제는 매우 간단하다는 것이 밝혀졌습니다. 저는 스위프트 수업을 공개적으로 선언하지 않았습니다! 공개 키워드를 클래스에 추가하자마자 프레임 워크 내부 및 외부의 클래스에서 사용할 수있었습니다.

또한 프레임 워크 내부 (다른 답변에서 언급 한 것처럼 .m 파일 내부) -Swift.h 파일을 다음과 같이 가져와야했습니다.

#import <FrameworkName/FrameworkName-Swift.h>

2
프레임 워크에서 Swift 클래스를 사용하려면 NSObject에서 상속해야하며 (@objc조차도 도움이되지 않음) 모든 메소드 / 속성은 공개되어야합니다.
dmitrynikolaev

3
적어도 현재 XCode 7 시험판에서는 NSObject에서 상속 될 때까지 생성 된 빠른 헤더에서 사용할 수 없습니다.
dmitrynikolaev 2016 년

100 %가 내 문제를 해결하지 못했습니다. 모든 해결책은 "수업 공개"입니다. 나는 이걸했다. 기간. 프레임 워크를 사용하는 프로젝트에서 여전히 Swift 클래스를 공개하지 않습니다.
datWooWoo

@lespommes, 문제를 나타내는 어딘가에 질문을 작성하고 샘플 프로젝트를 작성해야합니다. 누군가가 무슨 일이 일어나고 있는지 알아낼 수 있습니다 ... 나는 가장 큰 가시성 실수이기 때문에 가능한 한 가지 해결책으로 내 대답을주었습니다. 자주.
Kendall Helmstetter Gelner

2
오, 네, 수입에 대한 당신의 힌트는 마침내 나를 위해 속임수를 썼습니다! 고마워요!
endowzoner

14

나는 같은 문제가 있었다. 첫 Swift 파일을 추가 하기 전에 설정 (모듈 및 제품 모듈 이름 정의)을 조정해야하는 것 같습니다 .

나중에이 파일을 추가하거나 Swift 파일을 삭제하고 새 파일을 생성하더라도이 프로젝트에 대해 "* -Swift.h"파일이 생성되지 않습니다.


나는 그것이 확실하지 않다. 많은 신속한 파일을 만든 후에야 'Defines Module'을 사용하기로 결정하지 않았으며 -Swift.h를 얻을 수있었습니다.
Michael Peterson

실제로 이것이 내가 가진 문제라고보고하는 것이 슬프다. (. swift를 삭제하고 다시 추가 한 다음 모두 작동했다.
StuFF mc

2
이제 뭐? Swift와 ObjC 코드를 모두 변경하는 중입니다. My Project-Swift.h가 업데이트되지 않습니다. 헤더 파일을 삭제하려고했습니다.
Suhail Bhat

2
나는 이것을 dev.iachieved.it/iachievedit/?p=980 작성해야했다 . Swift 파일을 추가하기 전에 빌드 설정 업데이트에 대한 팁이 중요했습니다.
Joe

이 작업을 수행하지 않으면 프로젝트를 다시 작성하고 모든 것을 다시 추가해야합니까? 내가 무엇을하든 * -Swift.h 파일을 생성하지 못하는 것 같습니다.
kgreenek

13

오래된 objc 프로젝트에서 Swift를 사용하려는 경험을 공유 할 수 있습니다. 로 설정하지 않아도 Defines module됩니다 YES.

필자의 경우 objc Bridging Header가 있는지 수동으로 확인해야했습니다. 생성 된 인터페이스 헤더 이름 만 빌드 설정에있었습니다.

브리징 헤더가 없습니다.

이로 인해 MyApp-Swift.h 파일이 생성되지만 Swift 클래스의 흔적이 생성되지 않습니다.

Apple 문서에 따르면 첫 번째 신속한 파일을 추가 할 때 브리징 헤더를 만들라는 메시지가 표시됩니다. 글쎄, 아니었다. 수동으로 추가했습니다MyApp-Bridging-header.h파일을 하고 "Objective-C Bridging Header"필드에서 파일을 가리 켰습니다. 이로 인해 MyApp-Swift.h 파일이 Swift 클래스로 채워졌습니다.

문서 : Objective-C로 Swift 가져 오기


네, 어떤 이유로 든 ObjC Swift.h 파일은 프로젝트에 빈 브리징 헤더 파일을 추가 한 후에 만 ​​Swift 클래스 헤더로 생성되었습니다!
Andrew

여기도 마찬가지입니다. 빈 Objective-C 브리징 헤더 파일을 추가 할 때까지 Swift 코드를 생성 된 * -Swift.h 파일로 가져 오지 않았습니다.
Nik

12

다음은 생성되지 않은 moduleName-Swift.h의 다른 변형입니다.

내 프로젝트에 IOS 차트 를 포함하기로 결정 했지만 동일한 디렉토리의 소스를 섞고 싶지 않기 때문에 코드 프로젝트 폴더 옆에 차트 프로젝트 폴더를 배치했습니다. 차트 프로젝트를 프로젝트의 네비게이터 바로 끌어서 일반 프로젝트 설정에서 프로젝트 대상의 임베디드 바이너리 목록에 프레임 워크를 포함 시키고 빌드 옵션 섹션 의 프로젝트 빌드 설정 탭에서 임베디드 컨텐츠 포함 스위프트 코드 스위치를 예로 설정 했습니다 .

내 프로젝트의 moduleName-Swift.h 파일은 다른 스위치 또는 설정이 여기에 제안한 것과 상관없이 절대 생성하지 않습니다. 마지막으로 Lou Z의 -Swift.h 파일을 찾는 방법을 사용하여 Charts.framework / Headers /의 프로젝트 xcode 빌드 디렉토리에서 Charts-Swift.h 파일이 생성되고 있음을 알았습니다.

내 프로젝트의 소스 디렉토리에 코드를 포함하지 않고 Daniel Gindi의 ios-charts Swift 패키지를 사용하는 솔루션은 다음을 추가하는 것입니다.

#import "Charts/Charts-Swift.h"

내 프로젝트의 데이터를 차트로 표시하는 모듈.


IOS 차트에서 툴팁을 변경 / 사용자 정의 할 수 있습니까? 그렇다면 예를 하나 들어 줄 수 있습니까?
Amit Chauhan

12

파일 이름 앞에는 항상 대상 이름 이옵니다 . 제품 이름이라고하지만 실제로는 대상 이름입니다. 따라서 새 대상을 빌드하려는 경우 that_target-Swift.h파일 을 기대할 수 있습니다.

이것을 처리하는 한 가지 방법은

  1. 공백없이 대상 자체의 이름 인 각 대상에 대해 전처리기를 추가하십시오. 전의. MY_TARGET=1. 각 타겟의 프로젝트 설정-> 빌드 설정-> 전 처리기 매크로에서 이것을 추가하십시오.
  2. PCH 파일을 사용하는 경우

PCH 파일에이 줄을 추가하십시오

#if MY_TARGET==1
#include "My_Target-Swift.h"
#elif THAT_TARGET==1
#include "That_Target-Swift.h" 
#endif

PCH 파일을 사용하면 어디서나 헤더를 포함 할 필요가 없다는 장점이 있습니다.

  1. PCH 파일을 사용하지 않는 경우 동일한 헤더를 단일 헤더에 추가하고 신속한 클래스를 사용해야하는 경우 해당 헤더를 포함하십시오.

이것은 잘 작동합니다.


헤더를 소스로 직접 가져 오는 것 보다이 솔루션을 사용하는 것이 정말 좋습니다. 여러 대상 / 프로젝트에서 동일한 소스 코드를 사용하는 복잡한 프로젝트 구조가 있습니다. 이렇게하면 내 코드 전체에 지저분한 #if #else 문을 추가하지 않아도됩니다. 답변 해주셔서 감사합니다!
Ryan

이것은 나의 하루를 구했다. 5 줄의 코드를 "Something-Swift-Headers.h"파일에 넣었 include습니다. 그런 다음 필요한 곳에서이 새 파일을 가져옵니다. 주기적 종속성을 피하고 .m 파일의 편의 헤더를 사용하기 위해 PCH 또는 .h 파일에 넣지 않는 것이 좋습니다.
ctietze

이것은 많은 수준에서 잘못되었습니다. 첫째, .pch파일은 크게 권장하지 않습니다 . 둘째, 파일 이름 에는 제품 이름이 포함 되며 대상 이름은 전혀 포함 되지 않습니다. 동일하다는 것은 우연의 일치 일 수 있지만 제품 이름을 사용했습니다!
Iulian Onofrei

10

Xcode가 실제로 -Swift.h 헤더 (DerivedData 내부의 깊은)를 생성하지만 Swift 클래스를 참조하지 않는 경우 브리징 헤더도 정의되어 있는지 확인하십시오. 내가 문서를 읽는 방식은 Swift에서 Objective-C를 호출하는 데 필요하지만 Objective-C에서 Swift를 호출하는 데 필요하다는 것을 암시했습니다.

내 답변보기 : https://stackoverflow.com/a/27972946/337392

편집 : 그것은 결국 Apple 문서에서 설명했듯이 공개 대 내부 액세스 수정 자 때문입니다.

기본적으로 생성 된 헤더에는 public 수정 자로 표시된 Swift 선언에 대한 인터페이스가 포함됩니다. 앱 타겟에 Objective-C 브리징 헤더가있는 경우 내부 수정 자로 표시된 항목도 포함됩니다.


예, 이것은 정말로 도움이되었습니다. 나는 그것을 몰랐다. Swift 유스 케이스의 Obj-C에 필요하다고 생각했습니다.
nodepond December

도와 줄 수있어서 기뻐. 이 행동의 이유를 알게 되었기 때문에 답을 편집했습니다.
Echelon

7

많은 사람들이 여기에 있지만 두 번째로 적절한 스크린 샷을 추가합니다. Swift와 Obj-C 코드는 확실히 함께 살 수 있습니다. 전부 또는 전혀 게임이 아닙니다.

Objective-C에서 Swift 파일에 액세스하려면 Obj-C 파일 (.m / 구현 파일)에이 호출을 추가하기 만하면됩니다.

#import "{product_module_name}-Swift.h"

{where_product_module_name}은 프로젝트의 제품 모듈 이름을 나타냅니다. 제품 모듈 이름을 추측하거나 공백과 특수 문자가 포함 된 코너 케이스를 알아 내지 말고 프로젝트의 빌드 설정 탭으로 이동하여 "제품 모듈 이름"을 입력하면 검사관이 귀하에게 알려줍니다. 광산은 내가 기대하지 않은 것입니다. 혼란스러운 경우이 스크린 샷을 확인하십시오.

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

Swift에서 Obj-c 코드를 작동 시키려면 브리징 헤더 파일을 추가하고 관련 Obj-C 헤더를 가져와야합니다.


1
그렇지 #import않습니까?
Iulian Onofrei

내 프로젝트 이름이 ABC이고 "ABC-Swift.h"가 내 프로젝트에 있어야한다고 가정 해 봅시다. 찾을 수 없습니다. 수동으로 작성해야합니까? 나는 신속하게 작성된 코코아 포드를 포함하여 내 신속한 파일을 만들지 않습니다.
nr5

브리징 헤더 (귀하의 경우 ABC-Swift.h)는 자동으로 생성되지 않습니다. Obj-C 프로젝트에서 첫 번째 Swift 파일을 만들려고하면 일반적으로 Xcode에서 파일을 추가하라는 메시지를 표시합니다. : 여기에 표시 ( '헤더를 브리징'에 대한 컨트롤 + F)로 당신은 또한 자신에 브리징 헤더를 만들 수 있습니다 developer.apple.com/library/content/documentation/Swift/...
브라이언 Sachetta

5

가장 중요한 것은 이 파일이 보이지 않는다는 것입니다 !!! 적어도 Xcode6 beta5에 있습니다. 작업 공간에는 "YourModule-Swift.h"라는 파일이 없습니다. 모듈 이름이 있고 모듈이 yes로 설정되어 있는지 확인한 후 Objective-C 클래스에서 사용하십시오.


5

자, 여기 정말로 필요한 것들이 있습니다!

1. 추가 한 모든 빠른 파일을 제거하고 오류없이 코드를 컴파일하십시오.

----------

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

----------

2. "프로젝트"빌드 설정으로 이동하여 제품 모듈 이름을 설정하십시오. 프로젝트에는 공백이없는 제품 모듈 이름이 있어야합니다.

----------

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

----------

3. 빌드 설정, 패키징 아래, 프로젝트의 모듈에서 정의 모듈을 예로 설정해야합니다.

----------

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

----------

4. 이제 파일-> newFile->에서 빠른 파일 또는 뷰 컨트롤러를 만듭니다.

----------

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

----------

브리징 헤더를 만들고 요청할 수 있습니다. 한 번 거절 한 경우 -Bridging-Header.h를 수동으로 추가해야합니다.

5. 컨트롤러에 @objc를 추가하여 ObjectiveC에 노출 해야하는 신속한 파일이 있음을 컴파일러에 알리십시오.

----------

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

----------

6. objectiveC 컨트롤러에서 프로젝트를 빌드하고 #import "-Swift.h"를 가져 오면 작동합니다! 실제 파일을 보려면 Command- 클릭하십시오!

----------

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

----------

도움이 되었기를 바랍니다!


>> 실제 파일을 보려면 Command- 클릭하십시오! 이것은 멋지다
Jagan

4

이 답변은 Swift 클래스를 호출하는 Objective-C 코드가 이미 있고이 오류가 발생하기 시작하는 사용 사례를 해결합니다.

문제를 해결하는 방법

다음 단계는 궁극적으로 나를 위해 모든 문제를 해결했습니다. 나는 위에서 "닭과 계란"을 언급 한 누군가를 읽었으며 이것이 바로이 개념으로 나를 이끌어 낸 개념입니다. 이 명시 적 프로세스는 헤더가 생성 될 때까지 Swift 클래스를 참조하는 Objective-C 코드를 제거해야 함을 보여줍니다.

  1. Objective-C 구현 파일에서 #import "ProductModuleName-Swift.h"문을 주석 처리하십시오.
  2. Objective-C 구현 파일에서 Swift 클래스에 대한 참조를 주석 처리하십시오.
  3. 청소 및 빌드
  4. 모든 오류 / 경고 해결
  5. #import "ProductModuleName-Swift.h"문에서 주석을 제거하십시오.
  6. 정리 및 빌드 (성공하거나 남아있는 오류 수정) 이 시점에서 Objective-C의 Swift 클래스를 참조하고 있지 않은지 확인하십시오. . 임시로 주석 처리)
  7. #import "ProductModuleName-Swift.h"문의 클래스 이름을 Cmd-Clicking 하여 "ProductModuleName-Swift.h"가 생성되는지 확인하십시오 .
  8. Objective-C 구현 파일에서 Swift 클래스를 참조하는 코드에 대한 주석을 제거하십시오.
  9. 정상적으로 Clean & Build ( "ProductModuleName-Swift.h"가 생성되어야하며 Swift 클래스를 참조하는 Objective-C 코드를 정상적으로 사용할 수 있음)

Nota Bene : Apple Documentation에 지정된 규칙과 같이이 프로세스를 수행 할 때 공백을 밑줄로 변경하고 모듈 정의를 YES로 YES에 대한 답변이 여전히 적용됩니다. .

브리징 헤더 경로

하나의 오류로, 빌드 프로세스 중에 ProductModuleName-Bridging-Header.h 파일을 찾을 수 없습니다. 이 사실은 오류를 생성

<알 수 없음> : 0 : 오류 : 브리징 헤더 '/Users/Shared/Working/abc/abc-Bridging-Header.h'가 존재하지 않습니다.

오류의 가까이 검사는 파일이 (이 사실에 위치했기 때문에 설명 된 위치에 존재하지 않을 것이라고 표시 잘못된 경로 )

'/Users/Shared/Working/abc/abc/abc-Bridging-Header.h'. 대상 / 프로젝트 빌드 설정을 빠르게 검색하여 수동으로 수정하고 abc-Swift.h 파일이 다시 자동 생성되었습니다.

빌드 설정


1
프로젝트가 너무 커서 목표 c에서 신속한 코드의 모든 참조를 주석 처리하는 것이 비현실적이라면 어떻게 될까요?
Andrew Morris

3

Objective-C 클래스에서 헤더를 가져와야합니다.

#import “ProductModuleName-Swift.h”

"이 import 문을 포함하는 Objective-C .m 파일에서 대상의 모든 Swift 파일을 볼 수 있습니다"라는 참조에서 자동으로 생성됩니다.


24
그러나 그렇게하면 빌드 오류가 발생하고 AppName-Swift.h가 존재하지 않습니다. AppName-Bridging-Header.h는 존재합니다.
David Kristensen 2016 년

5
@DavidKristensen : 같은 문제에
봉착

2

프로젝트의 실제 파일은 생성되지 않습니다 ([ProductModuleName] -Swift.h). Cmd + 가져 오기를 클릭하면 즉시 (및 메모리에서) 가져 오기 때문에 링크가 수행되는 방법을 보거나 일부 Xcode 캐시 디렉토리에서 파일을 열 수 있지만 프로젝트 디렉토리에는 없습니다.

당신은 설정해야 정의 모듈 로 (대상의 빌드 설정에서) 프로젝트 소품을 및 모듈 이름에 공백이나 대시가있는 경우 - [ProductModuleName] -Swift.h 파일의 모든 수입에 사용 _합니다.

빠른 유형을 사용하는 모든 .h 및 .m 파일로 가져 오거나 .pch에서 가져올 수 있습니다.

따라서 내 모듈 (프로젝트)의 이름이 "Test Project"인 경우 프로젝트의 .pch 파일에서 다음과 같이 가져옵니다.

#import "Test_Project-Swift.h"

2

"."를 사용하는 모든 사람에게 도움이됩니다. 거기에 프로젝트 이름이 있습니다. Xcode는 "."를 대체합니다. 브리징 헤더 파일의 Swift 버전에 밑줄 "_"이 붙습니다. 이상하게도 생성 된 Bridging-Header.h는 마침표를 밑줄로 바꾸지 않습니다.

예를 들어 이름이 My.Project 인 프로젝트의 브리징 헤더 파일 이름은 다음과 같습니다.

Bridging-Header.h (자동 생성)

My.Project-Bridging-Header.h

스위프트

My_Project.h

나는 이것이 기간을 사용하고 나와 같이 붙어있는 사람에게 도움이되기를 바랍니다. 이 파일은 다음 위치에서 찾을 수 있습니다.

Macintosh HD / Users / 사용자 /Library/Developer/Xcode/DerivedData/My.Project-fntdulwpbhbbzdbyrkhanemcrfil/Build/Intermediates/My.Project.build/Debug-iphonesimulator/My.Project.build/DerivedSources

조심해


2

프로젝트에는 공백을 포함하지 않는 모듈 이름이 있어야합니다. 패키징 아래 빌드 설정에서 모듈을 예로 설정해야합니다. #import 문을 주석 처리했습니다.

여전히 "ProductModuleName-Swift.h"가져 오기 오류가 발생하면

// # import "ProductModuleName-Swift.h"

내 Swift 코드에 다른 많은 오류가 나타났습니다.

이 새로운 오류를 수정하고 소스 빌드를 성공적으로 받으면 #import 및 bingo의 주석 처리를 제거했습니다! 헤더가 작성되어 올바르게 가져 오기 :)


내 문제는 Swift 코드에도 오류가 있었지만 -Swift.h 파일의 주석 처리를 제거 할 때까지 알지 못했습니다. 감사!
Will

1

나는 항상 나에게 작동하는 트릭을 발견했다.

  1. appDelegate.h 파일과 ProductName-Prefix.pch 파일에 #import "ProductModuleName-Swift.h"를 작성하십시오. xcode 6 에없는 경우이 방법으로 만들 수 있습니다. 왜 ProjectName-Prefix.pch가 Xcode 6에 자동으로 생성되지 않습니까?
  2. "ProductModuleName-Swift.h"에 대한 오류가 발생하면 appDelegate.h 파일에서 코드를 삭제하십시오.
  3. 코드를 다시 정리하십시오. 이제 모든 것이 매력처럼 작동합니다
  4. "ProductModuleName-Swift.h"에 대한 오류가 다시 표시되면 appDelegate.h 파일에서 다시 작성하고 코드를 다시 정리하십시오.

이 오류 메시지가 표시 될 때마다이 작업을 수행하십시오 (appDelegate.h 파일에서 "ProductModuleName-Swift.h"를 삭제하고 코드를 정리하십시오).


1

이 솔루션을 찾았습니다

  • SwiftBridge.h 생성
  • #import“ProductModuleName-Swift.h”입력
  • 이 .h 파일을 공개로 설정 (중요) 파일 선택-> In 파일 검사기 표시 (오른쪽 막대)-> 공개로 설정

지금 당신은 할 수 있습니다

#import "SwiftBridge.h"

ProductModuleName-Swift.h 대신

이것은 해결 방법입니다. 다음 Xcode 버전에서는이 문제가 해결 될 것이라고 생각합니다. 행운을 빕니다


작동하지 않습니다. 그냥 해봐 이 줄 #import “ProductModuleName-Swift.h”은 원본 Objective-C 코드 파일 대신 SwiftBridge.h 파일에 오류가 발생했습니다.
Supertecnoboff

1

모듈 이름 / objective-c의 신속한 헤더 가져 오기를 결정하는 데 어려움을 겪고있었습니다. 나는 여기에서도 많은 기사를 읽었다.

그러나 포함 된 모든 특수 문자 ( '.'또는 숫자 또는 공백)가 포함 된 프로젝트 이름에 대한 정답- 대상의 빌드 설정 아래 에있는 " 제품 모듈 이름 "에서 유용한 텍스트를 찾을 수 있습니다. .

예를 들어 타겟 이름은 숫자 "1mg"으로 시작했으며 위에서 언급 한 필드에 "_mg"가 모듈 이름으로 표시되었습니다.

그래서 #import "_mg-Swift.h"를 사용했는데 효과가있었습니다.

대상 빌드 설정의 제품 모듈 이름은 프로젝트에 사용할 올바른 모듈 이름을 제공합니다.


스크린 샷에 대한 링크에서 편집 할 수 있다면 답변을 편집하여 표시 할 수 있습니다.
SuperBiasedMan

1

필자의 경우 배포 대상을 "OS X 10.9"이상으로 설정해야했고 -Swift.h헤더가 자동으로 생성되었습니다. 배포 대상 버전을 변경할 때, 특히 오래되고 규모가 큰 Objective C 코드 기반이있는 경우 많은 사용 중단 경고가 표시 될 수 있습니다. 우리의 경우에는 XIB 파일 및 뷰 클래스에서 많은 작업을 수행했습니다.


2
다른 사람의 경우-대상의 빌드 설정에서 정확한 이름 "MyProject-Swift.h"를 확인하십시오. 해당 Objc 파일에 "#include"MyProject-Swift.h "로 포함해야합니다. 답변이 정말 도움이되었습니다-구형 ObjectiveC 오픈 소스를 변환하기 위해 노력
David H

0

“ProductModuleName-Swift.h” not found오류 와 관련된 문제없이 이전에 프로젝트를 구축 할 수 있었는데 이제는 그 불쾌한 오류가 다시 발생하는 이유는 최근 변경 사항에있을 수 있습니다.

나에게 이것은 (우연한) 잘못된 .swift파일 인코딩에 의한 것입니다. 변경 사항을 되돌리고 수동으로 되 돌리면 작업이 수행됩니다.


0

이것은 명백한 점일 수도 있지만 (너무 명백 할 수도 있음) 헤더를 생성하려면 프로젝트에 하나 이상의 빠른 파일이 있어야합니다. 신속한 작성을 위해 상용구 또는 구성 코드를 작성하는 경우 나중에 가져 오기가 작동하지 않습니다.


0

Objective C 프로젝트에서 WatchOS2 빠른 코드를 삭제해야했습니다. 그리고 XCode가 -Swift.h를 생성하도록 제안한 후에 ​​만


0

비슷한 문제가 있었지만 파일 코드가 거의 변경되지 않으면 프로젝트가 컴파일되고 갑자기 오류가 발생했습니다. myproject-swift.h 파일에 대한 '파일을 찾을 수 없음'오류가 발생하는 이유를 파악하는 데 시간이 걸렸습니다. 내가 한 코드 변경에는 약간의 오류가있었습니다. Xcode는 항상 '파일을 찾을 수 없음 오류'를 표시하여 해당 오류를 지적하지 않았습니다. 그런 다음 이전 버전 코드의 사본을 얻었고 새 코드와 파일을 하나씩 병합했습니다. 각 파일 병합 후 오류를 찾기 위해 프로젝트를 준수했습니다. 결론적으로 코드에 오류가있는 경우 Xcode는 myproject-swift.h 파일에 대해 '파일을 찾을 수 없음 오류'를 표시 할 수 있습니다. 프로젝트에서 컴파일 오류가 발생했을 가능성이 높습니다. 해당 오류를 정리하면 작동합니다.


0

Cocoapods와 같은 것을 사용하고 있다면 (프로젝트가 아닌 작업 공간에서 작업하는 경우) 작업 공간을 열고 건물을 열기 전에 프로젝트를 열고 빌드하십시오. YMMV.


0

때로는 obj-c .m 파일에서 대상 멤버 자격을 설정 해제 한 다음 다시 설정해야합니다.

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