IT story

Xcode 6에서 Swift to Objective-C 헤더가 생성되지 않음

hot-time 2020. 4. 10. 08:21
반응형

Xcode 6에서 Swift to Objective-C 헤더가 생성되지 않음


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

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

그러나 *-Swift.h중 하나를 표시 스위프트 클래스를 노출하도록되어 헤더 파일 @objc또는 ObjC 클래스의 서브 클래스는,없는 데도 찾을 수 :-(

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

내가 리드 개발자 인 응용 프로그램은 상당히 큰 코드베이스 (70.000 줄)를 가지고 있으므로 한 번에 전환하는 것은 의문의 여지가 없습니다.


이제 작동합니다.

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

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


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

#import “ProductModuleName-Swift.h”

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


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

나를위한 문제는 실제로 닭고기 / 계란 문제라는 것이 었습니다. 실제로 #import진술을 주석 처리 할 때까지 빌드 오류가 발생하지 않았다는 것입니다 .

//#import "ProductModuleName-Swift.h"

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

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


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

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

#import "My_Project-Swift.h"


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

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

그것을 찾을 것입니다. 해당 폴더에 아무것도 없으면 Xcode가 생성하지 않습니다.

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


* 중요한 것은 : *

대상에 정의 된 "제품 모듈 이름"을 사용한 후 -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 속성으로 태그되어야합니다. 코코아 ...


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

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

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

#import <FrameworkName/FrameworkName-Swift.h>

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

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


다음은 생성되지 않은 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"

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


파일 이름 앞에는 항상 대상 이름 이옵니다 . 제품 이름이라고하지만 실제로는 대상 이름입니다. 따라서 새 대상을 빌드하려는 경우 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 파일을 사용하지 않는 경우 동일한 헤더를 단일 헤더에 추가하고 신속한 클래스를 사용해야하는 경우 해당 헤더를 포함하십시오.

이것은 잘 작동합니다.


오래된 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 가져 오기


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 코드는 확실히 함께 살 수 있습니다. 전부 또는 전혀 게임이 아닙니다.

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

#import "{product_module_name}-Swift.h"

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

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

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


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

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

----------

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

----------

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

----------

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

----------

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

----------

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

----------

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

----------

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

----------

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

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

----------

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

----------

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

----------

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

----------

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


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


이 답변은 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 코드를 정상적으로 사용할 수 있음)

참고 사항 : 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 파일이 다시 자동 생성되었습니다.

빌드 설정


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

#import “ProductModuleName-Swift.h”

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


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

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

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

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

#import "Test_Project-Swift.h"

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

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

Bridging-Header.h (자동 생성)

My.Project-Bridging-Header.h

스위프트

My_Project.h

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

매킨토시 HD / 사용자 / 사용자 /Library/Developer/Xcode/DerivedData/My.Project-fntdulwpbhbbzdbyrkhanemcrfil/Build/Intermediates/My.Project.build/Debug-iphonesimulator/My.Project.build/DerivedSources

조심해


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

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

// # import "ProductModuleName-Swift.h"

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

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


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

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

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


이 솔루션을 찾았습니다

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

지금 당신은 할 수 있습니다

#import "SwiftBridge.h"

ProductModuleName-Swift.h 대신

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


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

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

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

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

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


In my case I had to set the deployment target to at least “OS X 10.9” and the -Swift.h header was automatically generated. Keep in mind that you can get a lot of deprecation warnings when you change the deployment target version, especially when you have an older and very large Objective C code base. In our case we also had a lot of work to do in XIB files & view classes.


If you were able to build a project before, with no issues related to “ProductModuleName-Swift.h” not found error, and now you are getting that nasty errors again, the reason might sit in your recent changes.

For me this was by (accidental) incorrect .swift file encoding. Reverting changes and bringing the back manually, does the job.


This may be an obvious point (maybe too obvious), but you must have at least one swift file in the project for the header to generate. If you are writing boilerplate or config code with the intention of writing swift later the import won't work.


I had to delete WatchOS2 swift code from my Objective C project. And only after that XCode offered to generate -Swift.h


I had similar problem but my project was compiling before and suddenly got error after few files code change. It took me while to figure out why I am getting 'File not found' error for myproject-swift.h file. The code changes I had done had some errors. Xcode did not point put those error instead all time showing the 'File not found error'. Then got copy of previous version code and I compared with new code and merged file one by one. After each file merge complied the project to find the error. So bottom line is if you have error in your code Xcode may just display 'file not found error' for myproject-swift.h file. Most likely you have compilation error in your project. Clean those error and it will work.


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


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

참고 URL : https://stackoverflow.com/questions/24062618/swift-to-objective-c-header-not-created-in-xcode-6

반응형