Xcode 6 / Beta 4 : 프레임 워크 대상에 브리징 헤더 사용이 지원되지 않습니다


131

방금 Xcode 6 Beta 4로 업그레이드했으며 베타 2의 라이브 뷰를 위해 만든 프레임 워크가 있습니다. 또 다른 신속한 버그 로 인해 Obj-C 코드를 사용해야했습니다. 그래도 업그레이드 할 때 다음 오류가 발생합니다.

오류 : 프레임 워크 대상에 브리징 헤더 사용이 지원되지 않습니다

릴리스 정보에서 아무것도 보지 못했거나 다른 마이그레이션 경로를 찾았습니다. 다른 사람이 이것을 보았고 해결책에 도달 했습니까?

베타 3에서는 라이브 뷰에 대한 프레임 워크가 필요하지 않았지만 작동하는 경우 내 경우에는 의미가 있습니다. 폴백으로 제거 할 수는 있지만 베타 4에서 완전히 손상되지 않은 프레임 워크를 선호합니다.


"베타 3은 프레임 워크가 필요하지 않다는 것을 알고 있습니다." 어떻게?
hnh

2
(실시간보기)-편집 됨
Chris Conover

1
같은 문제가 발생합니다.
Simon Germain

2
와우, 당신의 작은 편집은 내 인생을 훨씬 더 좋게 만들었습니다. 어디서나이 변경 사항에 대해 듣지 못했습니다 (프레임 워크가 필요 없음). 이 @chrisco에 너무 감사합니다!
yonix

답변:


232

오류에서 알 수 있듯이 브리징 헤더는 프레임 워크에서 사용할 수 없습니다. 동일한 프레임 워크 대상 내에서 가져 오기 코드 의 섹션 믹스 & 매치 이의 사과 문서 힌트. "우산 헤더 파일에서 Swift에 노출하려는 모든 Objective-C 헤더를 가져 오십시오"라고 말합니다.

그러나 특정 헤더를 공개해야 할 수도 있음을 발견했습니다. 이 답변은 그 이유와 방법을 검토합니다. 스위프트 컴파일러 오류 : "프레임 워크 모듈 내부의 비 모듈 식 헤더" .

따라서 다음을 수행하십시오.

  1. 브리징 헤더 파일을 제거하십시오.
  2. 프레임 워크의 빌드 설정에서 브리징 헤더 파일에 대한 참조를 제거하십시오.
  3. 우산 파일 ([ProductName] .h)에 필요한 헤더를 추가하십시오.
  4. 포함 된 파일을 "빌드 단계"의 프레임 워크 "헤더"섹션에 공개하십시오.
  5. 청소하고 재건하십시오.

참고 : "우산 헤더 파일"은 일반적으로 프레임 워크의 모든 공용 헤더를 나타내는 파일 ([ProductName] .h)입니다. 일반적으로 프레임 워크에 포함 된 다른 헤더에 대한 #import 문 목록입니다. Xcode에서 UIKit.h를 열면 우산 파일의 좋은 예가 표시됩니다.


3
간결한 답변에 감사드립니다. 나는 그 부분을 읽었지만 우산과 브리징 헤더의 차이점에 대해 혼란 스러웠다.
Chris Conover

1
@이 문서의 "절 오브젝티브 C로 가져 오기 스위프트"를 체크 아웃 zaxy78 : developer.apple.com/library/ios/documentation/Swift/Conceptual/...
DeepFriedTwinkie

4
@DeepFriedTwinkie, "우산 파일에 필요한 헤더를 추가하십시오"라고 말할 때 어떤 우산 파일을 참조하고 있습니까? 감사.
Allan Macatingrao

2
이것이 바로 내가 필요한 것입니다. 공개 섹션에 추가하면 해결되었습니다.
olivaresF

20
신속한 클래스에서 사용해야하는 프레임 워크에서 비공개로 유지하려는 클래스를 이제 프레임 워크를 사용하는 모든 사람에게 공개해야한다고 가정하면 맞습니까? 이상적인 솔루션처럼 보이지 않습니다.
ospr

28

두 가지 가능성이 있습니다. 우산 헤더 파일에 필요한 헤더를 추가하고 공개하는 것은 한 가지 방법입니다. 그러나 Swift에서 헤더를 사용할 수 있어야하지만 공개적으로 사용할 수없는 경우에 문제가됩니다.

Swift에서 내부 헤더를 사용할 수있게하는 두 번째 가능성은 여기 에 자세히 설명되어 있습니다 . 기본적으로 다음과 유사한 모듈 맵을 작성해야합니다.

module AwesomeKitPrivate {  
  header "../InternalClass.h"
  export *
}

그런 다음 설정을 사용하여 XCode에 포함될 수 있습니다.

SWIFT_INCLUDE_PATHS = $(SRCROOT)/AwesomeKit/ProjectModule  

2
우수한! 감사. 모든 헤더를 공개하는 것보다 훨씬 선호되는 기술입니다.
David H

다른 솔루션에 대한 솔루션을 강력히 권고하고 자세한 솔루션을 제공하는 링크를 확인하십시오
Tancrede Chazallet

이것은 정답 imo이지만 달성하려는 목표에 따라 Swift-Objc interop에 많은 도움이되는 Apple 제공 매크로를 사용하여 벗어날 수 있습니다 : developer.apple.com/documentation/swift/ …
Joe Susnick

header문은 상대 경로를 사용할 수 있습니다. 다른 프레임 워크의 헤더를 추가하려면 어떻게해야합니까?
Georgios

13

Objective-C를 Swift로 가져 오기를 참조하십시오 .

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

  1. 빌드 설정의 패키징에서 해당 프레임 워크 대상에 대한 모듈 정의 설정이 "예"로 설정되어 있는지 확인하십시오.
  2. 우산 헤더 파일에서 Swift에 노출하려는 모든 Objective-C 헤더를 가져옵니다. 예를 들면 다음과 같습니다.

        #import "XYZ / XYZCustomCell.h"
        #import "XYZ / XYZCustomView.h"
        #import "XYZ / XYZCustomViewController.h"
    
  3. 포함 된 파일을 "빌드 단계"의 프레임 워크 "헤더"섹션에 공개하십시오.

  4. 청소하고 재건하십시오.

Swift는 우산 헤더에 공개하는 모든 헤더를 볼 수 있습니다. 해당 프레임 워크에있는 Objective-C 파일의 내용은 import 문없이 해당 프레임 워크 대상 내의 모든 Swift 파일에서 자동으로 사용 가능합니다. 시스템 클래스에서 사용하는 것과 동일한 Swift 구문으로 사용자 정의 Objective-C 코드를 사용하십시오.

let myOtherCell = XYZCustomCell()
myOtherCell.subtitle = "Another custom cell"

중요 : "우산 헤더 파일"은 {ModuleName} .h 파일을 의미합니다. BTW에서 대상 이름은 {ModuleName} .framework입니다.


1
내 모듈 Swift 파일에서 objc 파일을 사용하고 싶지만 다른 모듈에 노출하고 싶지 않습니다. 어떻게해야합니까?
Sazzad Hissain Khan

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