programing

Xcode 6에서 생성되지 않은 목표 C 헤더로 빠르게 이동

lastmoon 2023. 4. 22. 10:03
반응형

Xcode 6에서 생성되지 않은 목표 C 헤더로 빠르게 이동

저는 최근 Swift를 기존 프로젝트에 추가하여 실제 세계에서 시험해 보는 작업을 하고 있습니다.

프로젝트에 Swift 소스 파일을 추가하면 "Bridging Header" 즉 Objective-C를 Swift로 가져오는 데 문제가 없습니다.

그...*-Swift.h Swift 클래스를 공개해야 합니다.@objc또는 ObjC 클래스의 서브클래스를 찾을 수 없습니다.- (

메인 앱 코드(Objective-C)에서 Swift로 작성된 새로운 서브클래스를 사용하는 방법에 대한 구체적인 지침은 보이지 않습니다.

제가 리드 개발자인 앱은 코드 베이스가 상당히 크기 때문에 한 번에 이행하는 것은 무리입니다.

이제 됐다.

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

드디어 작동한다.여러분의 도움에 감사드립니다:-)

나도 비슷한 문제가 있었는데 너는 오직 추가만 할 수 있다는 것을 알았다.

#import "ProductModuleName-Swift.h"

검색되는 우산 헤더의 .h 파일이 아닌 obj-c.m 파일로 이동합니다.

파일을 생성하기 전에 빌드 오류를 모두 수정해야 했습니다.

문제는 이것이 치킨/계란 문제라는 것입니다. 실제로 코멘트를 하기 전까지는 빌드 오류를 볼 수 없었습니다.#import★★★★★★★★

//#import "ProductModuleName-Swift.h"

스위프트 코드의 다른 오류들이 많이 드러났습니다.

으로 취득한 후, 「 에러」의를 해제했습니다.#importImport되었습니다. :) Import하다. : )

저와 같다면 아마 헤더 이름을 잘못 알고 있을 겁니다.잠시 머리를 싸매고 Derived Data에 있는 파일을 찾았는데, 거기에 확실히 있습니다.셋업 시(표준 파생 데이터 폴더 사용):

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

찾을 거야.폴더에 일치하는 항목이 없으면 Xcode가 생성하지 않습니다.

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

프로젝트 모듈 이름에 공백이 있는 경우 공백을 밑줄로 교체해야 합니다.

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

# Import "My_Project-Swift"h"

중요한 건

타겟에 정의된 "Product Module Name" 뒤에 -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.

[ Defines Module ]파라미터가 [Yes]또는 [No]로 설정되어 있는지, [Product Module Name]프로젝트가 설정되어 있지 않은지에 관계없이,

주의: ObjectiveC / Foundation | | Cocoa ...에 노출되려면 NSObject에서 파생되거나 @objc 속성으로 태그가 부착되어야 합니다.

Swift 코드와 Objective-C 코드가 혼재된 프레임워크를 만들고 있었습니다.프레임워크 외부에서 Swift 클래스를 Import할 수 없었습니다.-Swift.h 파일을 확인했더니 생성 중이었는데 비어 있었습니다.

문제는 매우 간단했습니다.저는 Swift 수업을 공개하지 않았습니다!public 키워드를 클래스에 추가하자마자 프레임워크 내외부에서 사용할 수 있게 되었습니다.

또한 프레임워크 내에서 (다른 답변으로 언급되는 경우에만 .m 파일 내) -Swift.h 파일을 다음과 같이 Import해야 했습니다.

#import <FrameworkName/FrameworkName-Swift.h>

저도 같은 문제가 있었어요.첫 번째 Swift 파일을 추가하기 전에 설정(Defines Module and Product Module Name)을 조정해야 할 것 같습니다.

나중에 하면 "*-Swift"입니다.h" 파일은 Swift 파일을 추가하거나 Swift 파일을 삭제하고 새 파일을 생성해도 생성되지 않습니다.

오래된 objc 프로젝트에서 Swift를 사용하려고 했던 경험을 공유하겠습니다.는 굳이 정할할 i i i i를 설정할 .Defines module로로 합니다.YES.

이 경우 objc 브리징헤더가 있는지 수동으로 확인해야 합니다.생성된 인터페이스 헤더 이름만 빌드 설정에 있습니다.

브리징 헤더가 없습니다.

그러면 MyApp-Swift.h 파일이 생성되지만 Swift 클래스의 흔적은 없습니다.

Apple 문서에는 첫 번째 스위프트파일을 추가할 때 브리징헤더를 작성하도록 지시되어 있습니다. 아니었네요.가 수동으로 했습니다.MyApp-Bridging-header.h[목표 - C Bridging Header ]목표: C Bridging Header입니다.MyApp-Swift.h 스위프트입니다.

문서: Objective-C로의 Swift Import

생성되지 않은 moduleName-Swift.h의 다른 버전을 다음에 나타냅니다.

IOS Charts를 프로젝트에 포함시키기로 결정했지만 같은 디렉토리에 소스를 혼합하고 싶지 않았기 때문에 Charts Project 폴더를 코드의 프로젝트 폴더 옆에 배치했습니다.Charts 프로젝트를 프로젝트의 Navigator Bar로 끌어 일반 프로젝트 설정에서 프로젝트 대상의 Embedded Binarys 목록에 프레임워크를 포함시키고 Build Options 섹션에서 프로젝트의 Build Settings 탭에서 Embedded Content Contains Swift Code 스위치를 yes로 설정했습니다.

프로젝트의 moduleName-Swift.h 파일은 여기서 제안하는 다른 스위치나 설정에 관계없이 생성되지 않습니다.마지막으로 -Swift.h 파일을 찾는 Lou Z의 방법을 사용하여 Charts.framework/Headers/에 있는 프로젝트의 xcode Build 디렉토리에 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 파일을 사용하지 않는 경우는, 같은 행을 1 개의 헤더에 추가하고, swift 클래스를 사용할 필요가 있는 장소에 그 헤더를 포함합니다.

이 정도면 잘 될 거야

Xcode가 실제로 -Swift.h 헤더(Derived Data 깊은 곳)를 생성하고 있지만 Swift 클래스를 참조하고 있지 않은 경우 브리징헤더도 정의되어 있는지 확인합니다.제가 본 문서에서는 Swift에서 Objective-C로 전화를 걸기 위해서만 필요했지만, Objective-C에서 Swift로 전화를 걸기 위해서도 필요한 것 같습니다.

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

편집: 퍼블릭 액세스 수식어와 내부 액세스 수식어에 의한 것입니다.결국 Apple 문서에서 설명되었습니다.-

기본적으로는 생성된 헤더에는 퍼블릭 수식자로 마크된 Swift 선언용 인터페이스가 포함됩니다.앱 대상에 Objective-C 브리징 헤더가 있는 경우 내부 수정자로 표시된 것도 포함됩니다.

여기 많은 사람들이 가지고 있는 것에 동의하지만, 적절한 스크린샷을 추가한다.Swift와 Obj-C 코드는 확실히 함께 살 수 있습니다.이건 전부 아니면 아예 없는 게임이 아니야.

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

#import "{product_module_name}-Swift.h"

(여기서 {product_module_name}은 프로젝트의 제품 모듈 이름을 나타냅니다).제품 모듈 이름을 추측하거나 공백이나 특수문자가 포함된 코너 케이스를 찾는 대신 프로젝트의 빌드 설정 탭에 가서 "제품 모듈 이름"을 입력하면 검사자가 해당 모듈을 표시합니다.내 것은 내가 예상하지 못했던 것이었다.헷갈리면 이 스크린샷을 보세요.

여기에 이미지 설명 입력

또한 Obj-c 코드를 Swift에서 작동시키려면 브리징 헤더 파일을 추가하고 거기에 관련된 Obj-C 헤더를 Import하기만 하면 됩니다.

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

문제 해결 방법

다음 단계로 모든 문제가 해결되었습니다.나는 위에서 "닭과 달걀"을 언급하는 것을 읽었는데, 바로 그 개념이 나를 이 절차로 이끈 것이다.이 명시적 프로세스는 헤더가 생성될 때까지 Swift 클래스를 참조하는 Objective-C 코드를 삭제해야 함을 나타냅니다.

  1. #import "Product Module Name-Swift" 코멘트를 입력합니다.h" 문장은 Objective-C 구현 파일에 있습니다.
  2. Objective-C 구현 파일의 모든 참조를 Swift Classes에 코멘트합니다.
  3. 클린&빌드
  4. 모든 오류/경고 해결
  5. #import "Product Module Name-Swift" 코멘트를 삭제합니다.h"문
  6. 클리닝 및 빌드(성공 또는 나머지 오류를 수정하고 이 시점에서 Objective-C에서 Swift 클래스를 참조하고 있지 않은지 확인합니다).일시적으로 코멘트를 붙이는 경우)
  7. "Product Module Name-Swift"를 확인합니다.h"는 #import "Product Module Name-Swift" 클래스 이름을 Cmd-클릭하여 생성됩니다.h"문
  8. Objective-C 구현 파일에서 Swift 클래스를 참조하는 코드에 대한 주석을 삭제합니다.
  9. 정상적으로 청소 및 빌드('Product Module Name-Swift')h"가 생성되어 Swift 클래스를 참조하는 Objective-C 코드를 정상적으로 사용할 수 있습니다.)

주의사항:스페이스를 밑줄로 변경하고 위와 같이 모듈을 YES로 정의하는 것에 대한 답변은 Apple 문서에 지정된 규칙과 마찬가지로 이 프로세스를 수행할 때 적용됩니다.

브리징 헤더 패스

빌드 프로세스 중에 ProductModuleName-Bridging-Header.h 파일을 찾을 수 없었던 오류도 있습니다.이 사실이 오류를 생성했습니다.

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

에러를 자세히 조사하면, 실제로는 (잘못된 패스)에 배치되어 있기 때문에, 그 파일은 기재되어 있는 장소에 존재하지 않는 것을 알 수 있습니다.

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

빌드 인스톨

좋아, 여기 네가 정말 필요한 모든 것들이 있어!

1. 추가한 모든 swift 파일을 삭제하고 오류 없이 코드를 컴파일합니다.

----------

여기에 이미지 설명 입력

----------

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

----------

여기에 이미지 설명 입력

----------

3. 프로젝트에서는 빌드 설정, 패키징, 타깃이 아닌 "예"로 정의 모듈을 설정해야 합니다.

----------

여기에 이미지 설명 입력

----------

4. swift 파일 또는 뷰 컨트롤러를 file-> new File->에 만듭니다.

----------

여기에 이미지 설명 입력

----------

브리징 헤더의 작성을 요구하고, 브리징 헤더를 작성할 수 있도록 합니다.한 번 거부한 경우 -Bridging-Header.h를 수동으로 추가해야 합니다.

5. 컨트롤러에 @objc를 추가하여 컴파일러에 ObjectiveC에 공개해야 하는 빠른 파일이 있음을 알립니다.

----------

여기에 이미지 설명 입력

----------

6. 프로젝트를 구축하고 #import - Swift를 Import합니다.임의의 오브젝티브C 컨트롤러에 h"가 있으면 동작합니다!명령어를 클릭하면 실제 파일을 볼 수 있습니다.

----------

여기에 이미지 설명 입력

----------

이게 도움이 됐으면 좋겠네요!

가장 중요한 것은 이 파일이 보이지 않는다는 것입니다!!!적어도 Xcode6 베타5에는 있습니다."Your Module-Swift"라는 이름의 파일은 없습니다.h" 를 선택합니다.모듈명이 있고 모듈을 yes로 정의하여 Objective-C 클래스에서 사용합니다.

Objective-C 클래스에서 헤더를 Import해야 합니다.즉, 다음과 같습니다.

#import “ProductModuleName-Swift.h”

이 파일은 자동으로 생성되며, 참조에 "타깃의 모든 Swift 파일은 이 Import 문을 포함하는 Objective-C .m 파일에 표시됩니다."라고 표시됩니다.

프로젝트의 실제 파일은 생성되지 않습니다([ProductModuleName]-Swift.h).Cmd + Import를 클릭하면 링크 방법을 볼 수 있도록 즉시 생성(및 메모리 내)하거나 Xcode 캐시 dir 어딘가에 있는 파일을 열 수 있지만 프로젝트 dir에는 없습니다.

[ProductModuleName]-Swift.h 파일의 모든 Import에서 모듈 이름에 공백이나 대시가 있는 경우 (타겟의 빌드 설정에서) Definition Module 프로젝트 프로펠을 Yes로 설정해야 합니다.

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

모듈(프로젝트)이 "테스트 프로젝트"로 명명된 경우 프로젝트의 .pch 파일에 다음과 같이 Import합니다(바로 여기).

#import "Test_Project-Swift.h"

프로젝트 이름에 ""를 사용한 사람을 위한 경고입니다.Xcode는 브리징헤더 파일의 Swift 버전에 대해 "."를 밑줄 "_"로 바꿉니다.이상하게도 생성되는 Bridging-Header.h는 마침표를 밑줄로 대체하지 않습니다.

예를 들어 My라는 이름의 프로젝트를 예로 들 수 있습니다.프로젝트에는 다음과 같은 브리징헤더 파일명이 있습니다.

Bridging-Header.h(자동 생성)

My.Project-Bridging-Header.h

Swift.h

My_Project.h

나는 이것이 마침표를 쓰고 나처럼 고착된 사람들에게 도움이 되기를 바란다.이 파일은 다음 위치에서 찾을 수 있습니다.

Macintosh HD/Users/User/Library/Developer/Xcode/Derived Data/My.Project-fntdulpbbhbzbyrkhanemcrfil/Build/Intermediates/My.프로젝트.build/debug-iphonesimulator/My.프로젝트.빌드/파생 소스

몸조심하세요.

프로젝트에는 공백을 포함하지 않는 모듈 이름이 있어야 합니다.Define Module은 빌드 설정의 패키징에서 Yes로 설정해야 합니다. #import 문장은 다음과 같습니다.

그래도 "Product Module Name-Swift"를 가져오는 동안 오류가 발생했습니다.그럼 h"는

//# Import "Product Module Name-Swift"h"

스위프트 코드의 다른 오류들이 많이 드러났습니다.

이러한 새로운 오류를 수정하고 소스 빌딩을 성공적으로 취득한 후 #import와 bingo를 삭제했습니다.헤더가 생성되어 올바르게 Import되었습니다. : )

나는 항상 나에게 효과가 있는 속임수를 찾았다.

  1. #import "Product Module Name-Swift"를 만듭니다.appDelegate.h 파일과 ProductName-Prefix.pch 파일에 h"를 입력합니다.xcode 6에 없는 경우 다음과 같이 작성할 수 있습니다.왜 ProjectName-Prefix.pch는 Xcode 6에서 자동으로 생성되지 않습니까?
  2. "ProductModuleName-Swift"에 대한 오류가 표시되면 command+shift+k를 사용하여 코드를 삭제합니다.h"는 appDelegate.h 파일에서 삭제합니다.
  3. 코드를 다시 지웁니다.이제 모든 게 잘 될 거야
  4. "Product Module Name-Swift.h" 에 대한 오류가 다시 표시되면 appDelegate.h 파일에 다시 생성하고 코드를 다시 삭제하십시오.

이 작업을 수행합니다('Product Module Name-Swift' 삭제 및 생성).이 에러를 수신할 때마다, appDelegate.h 파일로부터h" 를 취득해, 코드를 클리어 합니다.

이 솔루션을 찾았습니다.

  • SwiftBridge.h를 만듭니다.
  • #import "Product Module Name-Swift.h"를 입력합니다.
  • 이 .h 파일을 공개합니다(중요) 파일을 선택합니다.-> [ Show the file Inspector ](오른쪽 바) -> [공개]

이제 할 수 있다

#import "SwiftBridge.h"

Product ModuleName-Swift.h 대신

이것은 회피책입니다.다음 버전의 Xcode에서는 이 문제가 해결될 것으로 생각합니다.행운을 빌어요

프로젝트를 없이 할 수 , 이 프로젝트와 관련된 없이 작업을 할 수 있었을 것입니다.“ProductModuleName-Swift.h” not found에러입니다만, 또 그 끔찍한 에러가 발생하고 있습니다.이유는 최근의 변경에 기인하고 있을 가능성이 있습니다.

로서는 틀렸다.swift으로 되돌리면 변경을 되돌리고 수동으로 되돌리는 것이 중요합니다.

module name/objective-c의 swift 헤더 Import를 결정하는데 어려움을 겪고 있었습니다.저도 여기서 기사를 많이 읽었어요.

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

예를 들어, 제 타겟 이름은 숫자 "1mg"으로 시작되며, 위의 필드에 모듈 이름으로 "_mg"이 표시됩니다.

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

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

이것은 명백한 포인트일 수도 있지만(너무 명백할 수도 있음), 헤더를 생성하려면 프로젝트에 적어도1개의 swift 파일이 있어야 합니다.나중에 신속하게 쓸 목적으로 보일러 플레이트 또는 설정 코드를 작성할 경우 Import는 작동하지 않습니다.

제 경우 도입 목표를 적어도 'OS X 10.9'로 설정하고-Swift.h헤더가 자동으로 생성되었습니다.배포 대상 버전을 변경할 때 특히 오래되고 매우 큰 목표 C 코드 베이스가 있는 경우 권장 해제 경고가 많이 표시될 수 있습니다.또, XIB 파일이나 뷰 클래스의 작업도 많이 했습니다.

나는 나의 Objective C 프로젝트에서 WatchOS2 swift 코드를 삭제해야만 했다.그 후에야 XCode가 Swift.h를 생성하겠다고 제안했습니다.

저도 비슷한 문제가 있었는데 예전에 프로젝트를 컴파일하고 있었는데 파일 코드를 몇 번 바꾼 후에 갑자기 오류가 발생했습니다.내 project-swift.h 파일에 대해 "File not found" 오류가 발생하는 이유를 알아내는 데 시간이 걸렸습니다.내가 한 코드 변경에 오류가 있었다.Xcode는 이러한 에러를 포인트하지 않고, 대신에 「File not found error」라고 하는 에러를 나타내고 있습니다.그리고 이전 버전 코드를 복사하여 새 코드와 비교하고 파일을 하나씩 병합했습니다.각 파일의 Marge 후에, 에러를 검출하기 위해서 프로젝트에 준거했습니다.즉, 코드에 오류가 있는 경우 Xcode는 myproject-swift.h 파일에 대해 'file not found error'를 표시할 수 있습니다.프로젝트에서 컴파일 오류가 발생했을 수 있습니다.이 오류를 해결하면 효과가 있습니다.

Cocoapods와 같은 것을 사용하는 경우(프로젝트가 아닌 워크스페이스에서 작업하는 경우) 워크스페이스를 열고 구축하기 전에 프로젝트를 열고 구축해 보십시오.YMMV

경우에 따라서는 obj-c.m 파일의 타깃멤버쉽을 설정 해제하고 다시 설정해야 합니다.

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

반응형