Objective-C에서 Swift 클래스를 사용할 수 없습니다


260

Swift내 앱에 코드 를 통합하려고하는데 내 앱이 작성되고 클래스가 Objective-C추가되었습니다 Swift. 나는 여기에 설명 된 모든 것을 다 했다 . 그러나 내 문제는 파일을 Xcode만들지 않고 -Swift.h브리징 헤더 만 생성 한다는 것 입니다. 그래서 나는 그것을 만들었지 만 실제로 비어 있습니다. Swift에서 모든 ObjC 클래스를 사용할 수 있지만 그 반대도 할 수 없습니다. 나는 빠른 수업을 표시 @objc했지만 도움이되지 않았습니다. 내가 지금 무엇을 할 수 있을까?

편집 : 애플은 말합니다 : "스위프트 코드를 Objective-C로 가져올 때, 당신은 Xcode-generated파일을 Objective-C에 노출시키기 위해 헤더 파일 에 의존합니다 . [...]이 헤더의 이름은 제품 모듈 이름이며" -Swift.h”. "

이제 해당 파일을 가져 오려면 오류가 발생합니다.

    //MainMenu.m

    #import "myProjectModule-Swift.h" //Error: 'myProjectModule-Swift.h' file not found

    @implementation MainMenu

내 FBManager.swift 파일은 다음과 같습니다.

@objc class FBManager: NSObject {

    var descr = "FBManager class"

    init() {
        super.init()
    }

    func desc(){
        println(descr)
    }

    func getSharedGameState() -> GameState{
        return GameState.sharedGameState() //OK! GameState is written in Objective-C and no error here
    }
}

27
YourProjectName-Swift.h컴파일하는 동안 Xcode가 자동으로 생성하는 마법의 헤더 파일이어야합니다 (실제로는 프로젝트 브라우저에 표시되지 않음). 작성한 것을 삭제하고 #import YourProjectName-Swift.hSwift 클래스를 사용하려는 파일에 추가하십시오 .
— Greg

3
앱을 빌드하고 myProjectModule있습니까? -Swift.h파일은 앱 이름으로 시작해야한다. 끝나는 파일이 -Bridging-Header.h있습니까? 당신은해야합니다. 그렇다면 해당 파일의 첫 번째 부분은 프로젝트 이름입니다. 해당 파일 이름의 첫 부분을 포함 시키십시오 -Swift.h.
— vacawama

4
프로젝트 에서이 작업을 성공적으로 수행했지만 -Swift.hMac에서 찾을 수있는 실제 파일이 없지만 포함 할 수는 있습니다. 따라서 그러한 파일을 찾는 데 매달리지 마십시오. 이름을 올바르게 지정했는지 확인하십시오.
— vacawama

2
@vacawama 다른 헤더 파일을 방문하는 것처럼 가져 오기를 Command- 클릭하면 Objective-C 파일에 import 문을 추가 한 후 내용을 볼 수 있습니다.
— Kendall Helmstetter Gelner

4
나는 사용해야했다#import <MyProjectName/MyProjectName-Swift.h>
— Oliver Pearmain

답변:


516

Objective-C 기반 프로젝트 Swift에서 활성화하는 데 약 4 시간이 걸렸습니다 Xcode. myproject-Swift.h파일이 성공적으로 생성되었지만 내 파일이 Xcode보이지 않습니다 Swift-classes. 그래서 나는 새로운 XcodeObjc 기반 프로젝트 를 만들기로 결정 했고 마침내 정답을 찾았습니다! 이 게시물이 누군가를 도울 수 있기를 바랍니다 :-)

Xcode Objc 기반 프로젝트를위한 단계별 Swift 통합 :

  1. *.swiftXcode에서 새 파일을 생성 하거나 Finder를 사용하여 추가하십시오.
  2. Objective-C bridging headerXcode가 그것에 대해 물을 때를 만드십시오 .
  3. Swift 클래스를 구현하십시오.

    import Foundation
    
    // use @objc or @objcMembers annotation if necessary
    class Foo {
        //..
    }
    
  4. 빌드 설정을 열고 다음 매개 변수를 확인하십시오.

    • 모듈을 정의합니다 : YES

      검색 창에 매개 변수 이름 복사 및 붙여 넣기

    • 제품 모듈 이름 : myproject

      제품 모듈 이름에 특수 문자가 포함되어 있지 않은지 확인하십시오

    • Objective-C 호환성 헤더를 설치하십시오. YES

      *.swift프로젝트 에 파일을 추가하면 이 속성이 빌드 설정에 나타납니다

    • Objective-C 생성 인터페이스 헤더 : myproject-Swift.h

      이 헤더는 Xcode에 의해 자동 생성됩니다

    • 오브젝티브 -C 브리징 헤더 : $(SRCROOT)/myproject-Bridging-Header.h
  5. * .m 파일에서 Swift 인터페이스 헤더를 가져옵니다.

    #import "myproject-Swift.h"

    오류 및 경고에주의하지 마십시오.

  6. Xcode 프로젝트를 정리하고 다시 빌드하십시오.
  7. 이익!

2
위의 4 단계 에서 developer.apple.com/library/prerelease/ios/documentation/Swift/… 에 있는 설명서에서 필요한 구성에 대해 언급 한 사람이 있습니까? 그것이 내가 그리워했다면. 감사합니다 @sig.
— Morkrom

2
내 문제는 훨씬 간단했습니다. 파일을 찾을 수 "myproject-Swift.h"없어서 작동하지 않는 것 같습니다. 분명히이 파일은 프로젝트 탐색기에서 보이지 않습니다.
— Asaf

6
@Asaf 사실,이 파일은 Xcode에 의해 자동 생성되고 프로젝트 빌드 경로에서 찾습니다. 따라서 Finder / Console에서이 파일을 수동으로 찾거나 Cmd + LeftClick on을 사용하여 Xcode에서 직접 열 수 있습니다 #import "myproject-Swift.h".
— sig

1
나에 관해서는 # 5는 문제를 해결하기에 충분했습니다!!
— skywinder

12
당신의 그 4 시간으로, 당신은 우리 시간의 수백을 절약했습니다. 감사합니다. :) 내 마음에
— 들었습니다

65

헤더 파일을 직접 만들지 마십시오. 만든 것을 삭제하십시오.

Swift 클래스가 @objc에서 (직접 또는 간접적으로) 파생 된 클래스로 태그 되거나 상속 된 클래스인지 확인하십시오 NSObject.

프로젝트에 컴파일러 오류가 있으면 Xcode에서 파일을 생성하지 않습니다. 프로젝트가 올바르게 빌드되었는지 확인하십시오.


8
빌드 가능한 것이 나를위한 열쇠였습니다. 내 -swift.h 파일을 찾을 수 있지만 구축 할 수 없기 때문에 내 -swift.h 파일을 찾을 수 있기 때문에 만들 수 없습니다 : /
— 앤더스

13
그 사이클에 @anders가 find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -u있으면 파일이 나처럼 예상치 않은 이름으로 만들어 졌는지 확인할 수 있습니다 . :)
— CodeReaper

38

Xcode가 작동하도록 허용하고 Swift 헤더를 수동으로 추가 / 생성하지 마십시오. Swift 클래스 ex 전에 @objc를 추가하십시오.

@objc class YourSwiftClassName: UIViewController

프로젝트 설정에서 아래 플래그를 검색하고 YES로 변경하십시오 (프로젝트 및 대상 모두)

Defines Module : YES
Always Embed Swift Standard Libraries : YES
Install Objective-C Compatibility Header : YES

그런 다음 빌드가 성공한 후 프로젝트를 정리하고 한 번 빌드하십시오 (아마도 objective-c class .m 파일의 헤더 파일 아래로 가져와야 함)

#import "YourProjectName-Swift.h" 

oooo!


1
고마워, 이것은 환상적으로 간단하고 내 문제를 해결했습니다.
— Felipe

빌드 설정 (Xcode 7.3.1)에 이러한 옵션이 없습니다. 어떻게해야합니까?
— iosdude

1
^ 상단 바에서에서 로 전환 Basic해야 All했습니다.
— iosdude

1
Embedded Content Contains Swift로 변경되었습니다 Always Embed Swift Standard Libraries: 엑스 코드 8 stackoverflow.com/questions/38792650/...
— 윌리엄 그랜드

@WilliamGrand 제안에 감사드립니다.
— Bharat Modi

28

또한 Framework 대상 이있는 사람들에게 도움이 될 것입니다 .

자동 생성 된 헤더 파일 의 import 문 은 앱 대상과 약간 다릅니다 . 다른 답변에 언급 된 다른 것들 외에도

#import <ProductName/ProductModuleName-Swift.h>

대신에

#import "ProductModuleName-Swift.h"

프레임 워크 대상에 대한 믹스 앤 매치 에 관한 Apple 문서에 따라 .


1
@dinesharjani 다행입니다. :)
— Jeehut

번들 대상은 어떻습니까?
— Iulian Onofrei

14

프로젝트가 모듈을 정의하고 모듈에 이름을 지정했는지 확인하십시오. 그런 다음 다시 빌드하면 Xcode가 -Swift.h헤더 파일 을 작성하고 가져올 수 있습니다.

프로젝트 설정에서 모듈 정의 및 모듈 이름을 설정할 수 있습니다.


14

세부 사항 : Xcode 8.1에서 Swift 3 코드가있는 Objective-C 프로젝트

작업 :

  1. objective-c 클래스에서 swift enum 사용
  2. 신속한 클래스에서 objective-c enum 사용

전체 샘플

1. Swift 열거 형을 사용하는 Objective-C 클래스

ObjcClass.h

#import <Foundation/Foundation.h>

typedef NS_ENUM(NSInteger, ObjcEnum) {
    ObjcEnumValue1,
    ObjcEnumValue2,
    ObjcEnumValue3
};

@interface ObjcClass : NSObject

+ (void) PrintEnumValues;

@end

ObjcClass.m

#import "ObjcClass.h"
#import "SwiftCode.h"

@implementation ObjcClass

+ (void) PrintEnumValues {
    [self PrintEnumValue:SwiftEnumValue1];
    [self PrintEnumValue:SwiftEnumValue2];
    [self PrintEnumValue:SwiftEnumValue3];
}

+ (void) PrintEnumValue:(SwiftEnum) value {
    switch (value) {
        case SwiftEnumValue1:
            NSLog(@"-- SwiftEnum: SwiftEnumValue1");
            break;
            
        case SwiftEnumValue2:
        case SwiftEnumValue3:
            NSLog(@"-- SwiftEnum: long value = %ld", (long)value);
            break;
    }
}

@end

Objective-C 코드에서 스위프트 코드 감지

내 샘플에서는 SwiftCode.h를 사용하여 Objective-C에서 Swift 코드를 감지합니다. 이 파일은 자동으로 생성되며 (프로젝트에서이 헤더 파일의 실제 복사본을 만들지 않았습니다)이 파일의 이름 만 설정할 수 있습니다.

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

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

컴파일러가 헤더 파일 Swift 코드를 찾을 수 없으면 프로젝트를 컴파일하십시오.

Objective-C 열거 형을 사용하는 Swift 클래스

import Foundation

@objc
enum SwiftEnum: Int {
    case Value1, Value2, Value3
}

@objc
class SwiftClass: NSObject {
    
    class func PrintEnumValues() {
        PrintEnumValue(.Value1)
        PrintEnumValue(.Value2)
        PrintEnumValue(.Value3)
    }
    
    class func PrintEnumValue(value: ObjcEnum) {
        switch value {
        case .Value1, .Value2:
            NSLog("-- ObjcEnum: int value = \(value.rawValue)")
            
        case .Value3:
            NSLog("-- ObjcEnum: Value3")
            break
        }
        
    }
}

Swift 코드에서 Objective-C 코드 감지

브리징 헤더 파일을 만들어야합니다. Objective-C 프로젝트에 Swift 파일을 추가하거나 신속한 프로젝트에 Objective-C 파일을 추가하면 Xcode에서 브리징 헤더를 생성하도록 제안합니다.

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

여기에서 브리징 헤더 파일 이름을 변경할 수 있습니다.

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

브리징 헤더 .h

#import "ObjcClass.h"

용법

#import "SwiftCode.h"
...
[ObjcClass PrintEnumValues];
[SwiftClass PrintEnumValues];
[SwiftClass PrintEnumValue:ObjcEnumValue3];

결과

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


더 많은 샘플

전체 통합은 목표 - C 단계와 스위프트는 전술 . 이제 다른 코드 예제를 작성하겠습니다.

3. Objective-c 코드에서 Swift 클래스 호출

스위프트 클래스

import Foundation

@objc
class SwiftClass:NSObject {
    
    private var _stringValue: String
    var stringValue: String {
        get {
            print("SwiftClass get stringValue")
            return _stringValue
        }
        set {
            print("SwiftClass set stringValue = \(newValue)")
            _stringValue = newValue
        }
    }
    
    init (stringValue: String) {
        print("SwiftClass init(String)")
        _stringValue = stringValue
    }
    
    func printValue() {
        print("SwiftClass printValue()")
        print("stringValue = \(_stringValue)")
    }
    
}

Objective-C 코드 (호출 코드)

SwiftClass *obj = [[SwiftClass alloc] initWithStringValue: @"Hello World!"];
[obj printValue];
NSString * str = obj.stringValue;
obj.stringValue = @"HeLLo wOrLd!!!";

결과

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

4. 스위프트 코드에서 Objective-c 클래스 호출

Objective-C 클래스 (ObjcClass.h)

#import <Foundation/Foundation.h>

@interface ObjcClass : NSObject
@property NSString* stringValue;
- (instancetype) initWithStringValue:(NSString*)stringValue;
- (void) printValue;
@end

ObjcClass.m

#import "ObjcClass.h"

@interface ObjcClass()

@property NSString* strValue;

@end

@implementation ObjcClass

- (instancetype) initWithStringValue:(NSString*)stringValue {
    NSLog(@"ObjcClass initWithStringValue");
    _strValue = stringValue;
    return self;
}

- (void) printValue {
    NSLog(@"ObjcClass printValue");
    NSLog(@"stringValue = %@", _strValue);
}

- (NSString*) stringValue {
    NSLog(@"ObjcClass get stringValue");
    return _strValue;
}

- (void) setStringValue:(NSString*)newValue {
    NSLog(@"ObjcClass set stringValue = %@", newValue);
    _strValue = newValue;
}

@end

스위프트 코드 (호출 코드)

if let obj = ObjcClass(stringValue:  "Hello World!") {
    obj.printValue()
    let str = obj.stringValue;
    obj.stringValue = "HeLLo wOrLd!!!";
}

결과

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

5. Objective-c 코드에서 Swift 확장 사용

스위프트 확장

extension UIView {
    static func swiftExtensionFunc() {
        NSLog("UIView swiftExtensionFunc")
    }
}

Objective-C 코드 (호출 코드)

[UIView swiftExtensionFunc];

6. 신속한 코드에서 Objective-c 확장 사용

Objective-C 확장 (UIViewExtension.h)

#import <UIKit/UIKit.h>

@interface UIView (ObjcAdditions)
+ (void)objcExtensionFunc;
@end

UIViewExtension.m

@implementation UIView (ObjcAdditions)
+ (void)objcExtensionFunc {
    NSLog(@"UIView objcExtensionFunc");
}
@end

스위프트 코드 (호출 코드)

UIView.objcExtensionFunc()

이 샘플은 정말 도움이됩니다. 감사합니다! 그리고 Swift 4+ @objcMembers는 수업 앞에 추가해야합니다 . 때문에 @objc추론 최적화 목적을 위해 스위프트 4 감소되었다. 예를 들어 NSObject 파생 클래스 내의 속성은 더 이상 기본적으로 @objc를 유추하지 않습니다 (Swift 3에서와 같이). 이 답변 에서이 정보를 얻었습니다 .
— Hustlion

11

나는 같은 문제를 겪었고 모듈 이름의 특수 기호가 xcode로 대체되었습니다 (내 경우 대시는 밑줄이되었습니다). 프로젝트 설정에서 "모듈 이름"을 확인하여 프로젝트의 모듈 이름을 찾으십시오. 그런 다음 ModuleName-Swift.h설정에서 모듈을 사용 하거나 이름을 바꿉니다.


10
나는 바보입니다. 클래스 이름을 추가 한 다음 "-Swift"를 추가했습니다. 그것이 "모듈"이름으로 밝혀졌습니다. 내가 이것을 깨닫게 해준 +1
— HotFudge

2
그것이 클래스 이름이라고 생각했던 또 다른 바보!
— Charlie Martin

9

파일이 자동으로 생성됩니다 (여기서는 Xcode 6.3.2에 대해 이야기 함). 그러나 Derived Data 폴더에 있기 때문에 보이지 않습니다. 빠른 클래스를로 표시 한 후 @objc컴파일 한 다음 Swift.h파생 데이터 폴더에서 검색 하십시오. Swift 헤더가 있습니다.

Xcode의 이름 my-Project-Swift.h을 my_Project-Swift.hXcode 로 바꾸지 않는 "." "-"등 의 문제 가 있습니다. 위의 방법으로 파일 이름을 찾아 Objective-C 클래스로 가져올 수 있습니다.


1
이것도 내 문제를 해결했다. 내 .m 파일에서 다음 #import "my_project-Swift.h" 과 같은 파일을 가져오고 실제 프로젝트 이름은 다음 과 같습니다.my-project
— Bhavin_m

"-"만이 아니라주의 "-"도 공백 :(
— user1105951

8

.m 또는 .h 파일에 #import "myProject-Swift.h"만 포함

PS 파일 관리자에서 "myProject-Swift.h"가 보이지 않습니다. 그러나 앱에서 자동으로 생성됩니다.


고마워, 친구
— Felipe

이 대답은 나를 도우며 하루를 구했습니다. 중요한 것은 Xcode가 자동으로 생성하고 HIDDEN 파일이라는 것입니다. "myProject-Swift.h"를 직접 만들고 있는데 작동하지 않았습니다.
— C0mrade

5

@sig answer는 최고 중 하나이지만 오래된 프로젝트 (새로운 것이 아닙니다!)에서 작동하지 않았으므로 약간의 수정이 필요했습니다. 많은 변형 후 (XCode 7.2 사용) 나에게 레시피를 찾았습니다.

  1. 제품 모듈 이름 : $ (PRODUCT_NAME : c99extidentifier)
  2. 모듈 정의 : NO
  3. 임베디드 컨텐츠에 스위프트가 포함되어 있음 : NO
  4. Objective-C 호환성 헤더 설치 : 예
  5. Objective-C 브리징 헤더 : ProjectName-Bridging-Header.h

마지막 요점 (5)이 중요했습니다. 두 번째 섹션 (Targets 필드)에만 두었습니다. Project 필드는 비워 두어야합니다. 여기에 이미지 설명을 입력하십시오그렇지 않으면 올바른 "Project-Swift.h"파일이 생성되지 않았습니다 (빠른 방법은 포함되지 않음).


1
또한 유용한 링크 : ericasadun.com/2014/08/21/…
— Darius Miliauskas

1
고마워 고마워 고마워 @DariusMiliauskas는 단지 당신의 링크와 함께 작동하게
— a4arpan

1
트윗 담아 가기 5 포인트는 또한 오래된 Xcode 프로젝트에서 나를 위해 문제를 해결했습니다
— tatiana_c

Define Modules해야한다 No??
— Sunil Chauhan


5

두 가지 조건이 있습니다.

  • 객관적인 C 파일에서 빠른 파일을 사용하십시오.
  • 빠른 파일에서 목적 c 파일을 사용하십시오.

따라서이를 위해서는 다음 단계를 수행해야합니다.

  • 빠른 파일을 objective-c 프로젝트에 추가하거나 그 반대로 추가하십시오.
  • 헤더 (.h) 파일을 만듭니다.
  • 빌드 설정으로 이동하여 검색을 통해 아래 단계를 수행하십시오.

    1. 이 텍스트 "brid"를 검색하고 헤더 파일의 경로를 설정하십시오.
    2. "모듈 정의": 예.
    3. "항상 Swift 표준 라이브러리 임베드": 예.
    4. "Objective-C 호환성 헤더 설치": 예.

그런 다음 프로젝트를 정리하고 다시 빌드하십시오.

객관적인 C 파일에서 빠른 파일을 사용하십시오.

이 경우, 먼저 클래스 앞에 "@objc"를 빠른 파일로 작성하십시오.

그런 다음 객관적인 c 파일에 다음을 작성하십시오.

  #import "YourProjectName-Swift.h"

빠른 파일에서 목적 c 파일을 사용하십시오.

이 경우 헤더 파일에 다음을 작성하십시오.

  #import "YourObjective-c_FileName.h"

이것이 도움이되기를 바랍니다.


4

스위프트 5 :

  1. @objc클래스와 메소드에 키워드 추가
  2. public클래스와 메소드에 키워드 추가
  3. 수업에서 상속 받자 NSObject
  4. 프로젝트 구축
  5. #import "MyProject-Swift.h"Objective-C 파일에 넣 습니다

    @objc
    public class MyClass: NSObject {
    
        @objc
        public func myMethod() {
    
        }
    }

"클래스 및 방법에 @objc 키워드를 추가"- 같은 스위프트 4
— 르지 Skrzynecki에게

3

내 경우에는 다음 단계를 제외하고 :

  1. 제품 모듈 이름 : myproject
  2. 모듈 정의 : 예
  3. 포함 된 컨텐츠에 스위프트가 포함됨 : 예
  4. Objective-C 호환성 헤더 설치 : 예
  5. 오브젝티브 -C 브리징 헤더 : $ (SRCROOT) /Sources/SwiftBridging.h

productName-Swift.h 파일 을 만들려면 클래스를 공개 로 설정해야했습니다 .

import UIKit

   @objc public class TestSwift: NSObject {
       func sayHello() {
          print("Hi there!")
       }
   }

2

방금 신속한 파일 디렉토리를 프로젝트에 추가하면 작동하지 않는다는 것을 알았습니다. 디렉토리에 대한 그룹을 먼저 생성 한 다음 신속한 파일을 추가해야합니다.


@ <특정 클래스>; 정의한 다음 사용중인 프로젝트에서 해당 파일을 볼 수 있습니다.
— Nikita

2

나는 같은 문제가 있었고 마침내 그들은 같은 목표에 붙어 있지 않은 것처럼 보였다. ObjC 클래스는 Target1 및 Target2에 연결되고 Swift 클래스는 Target1에만 연결되며 ObjC 클래스 내부에는 표시되지 않습니다.

이것이 누군가를 돕기를 바랍니다.


나는 준비와 생산에 대한 다른 목표로 이것을 완전히 간과했습니다. 답변 주셔서 감사합니다!
— Benjamin Martin

"첨부 된"은 무엇을 의미합니까?
— Iulian Onofrei

"attached"= "members"는 대상 멤버로 나열되어야합니다.
— Dani.Rangelov

1

xcode가 브리지 파일을 만든 후에 내 문제가 발생했지만 여전히 헤더 파일 이름 MYPROJECTNAME-swift.h에 오류가 발생했습니다.

1. 터미널을 체크인하고 모든 자동 생성 된 스위프트 브리지 파일을 검색합니다.

find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -

xcode가 생성 한 것을 볼 수 있습니다.

  1. 내 경우에는 프로젝트 이름에 공백이 있었고 xcode는 '_'입니다.

1

새 Swift 파일을 프로젝트에 추가 할 때 올바른 대상에 추가해야합니다. 사용할 모든 신속한 파일이 NSObject 클래스를 상속하고 ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES 옵션 아래 빌드 설정에서 @ObjCMembers Change로 YES로 주석이 달렸는지 확인하십시오. 옵션 DEFINES_MODULE 아래의 빌드 설정에서 YES로 변경하십시오.


0

같은 오류가 있습니다 : myProjectModule-Swift.h파일을 찾을 수 없습니다 ", 그러나 제 경우에는 잘못된 배포 대상에있었습니다." Swift10.9 이전의 OS X에서는 사용할 수 없습니다. 로 설정하십시오 MACOSX_DEPLOYMENT_TARGET내가 10.9에 배포 대상을 변경 한 경우 10.9 이상에 (현재는 '10 .7 '이다) "그래서, - 프로젝트를 성공적으로 컴파일되었다.


0

내 문제는 -swift.h 파일의 자동 생성이 CustomDebugStringConvertible의 하위 클래스를 이해할 수 없다는 것입니다. 대신 class를 NSObject의 하위 클래스로 변경했습니다. 그 후 -swift.h 파일에 클래스가 올바르게 포함되었습니다.


0

objective-c 브리징 헤더에 클래스를 추가하고 가져온 objective-c 헤더에서 빠른 헤더를 가져 오려고하는 문제가있었습니다. 그것은 마음에 들지 않았다.

따라서 스위프트를 사용하지만 브리지되는 모든 objective-c 클래스에서 핵심은 헤더에서 전방 클래스 선언을 사용하고 .m 파일에서 "* -Swift.h"파일을 가져 오는 것입니다.


0

빌드의 설정을 변경하거나 @obj를 클래스에 추가 할 필요가 없었습니다.

내가해야 할 일은 Swift 클래스를 Objective-c 프로젝트에 만들 때 자동으로 생성 된 브리지 헤더를 만드는 것입니다. 그리고 난 방금해야 했어요

해당 신속한 파일을 사용해야하는 objective-c 파일에서 "Bedtime-Swift.h"<-를 가져옵니다.


0

글쎄, 모든 주석을 읽고 시도하고 읽고 다시 시도한 후 빠른 클래스를 Big obj-c 프로젝트에 포함시킬 수있었습니다. 모든 도움을 주셔서 감사합니다. 프로세스를 더 잘 이해하는 데 도움이되는 팁 하나를 공유하고 싶었습니다. .m 클래스에서 빠른 대상 이름 #import "myTargetName-Swift.h"의 가져 오기 행으로 이동하여 키를 클릭하십시오.

명령 + 마우스 클릭-> 정의로 이동 여기에 이미지 설명을 입력하십시오

여기에서 swift에서 obj-c 로의 모든 변환을 볼 수 있으며 obj-c에 다시 선언 된 다양한 기능을 찾을 수 있습니다. 이 팁이 도움이 되었기를 바랍니다.


0

Objective-C에서 스위프트 클래스 사용

앱 타겟 내에서 코드를 가져 오려는 경우 (한 프로젝트에서 혼합 Objective-C 및 Swift) 다음 가져 오기 행 #import "<#YourProjectName#>-Swift.h"을 사용하여 Swift 코드를 Objective-C 코드에 노출 해야합니다 [프로젝트의 혼합 Swift 및 Objective-C 코드]

이 글에서는 Swift 정적 라이브러리를 Objective-C 코드로 가져 오는 방법에 대해 설명합니다.

Objective-C 소비자-> Swift 정적 라이브러리

Xcode 버전 10.2.1

스위프트 정적 라이브러리 생성

따르다 Create Swift static library다음 추가 사항을 .

Swift API를 노출하십시오. Objective-C에서 Swift의 기능을 사용하려면 [정보]

빌드 후 [파일을 찾을 수 없음]<product_name>-Swift.h 에 있는 파일을 찾아야합니다 DerivedSources .

Swift 정적 라이브러리가있는 Objective-C 소비자

Drag and dropXcode 프로젝트의 바이너리 [정보]

Link Library[정의되지 않은 기호] [링크 대 포함]

Project editor -> select a target -> General -> Linked Frameworks and Libraries -> add -> Add Others... -> point to `lib<product_name>.a` file
//or
Project editor -> select a target -> Build Phases -> Link Binary With Libraries -> add -> Add Others... -> point to `lib<product_name>.a` file

추가 Library Search paths[라이브러리 찾을 수 없습니다] [재귀 경로]

Project editor -> select a target -> Build Settings -> Search Paths -> Library Search paths -> add path to the parent of `lib<product_name>.a` file

추가 Header Search Paths[모듈을 찾을 수 없음] [재귀 경로]

Project editor -> select a target -> Build Settings -> Search Paths -> Header Search Paths -> add path to generated `<product_name>-Swift.h` file 

.swift fileObjective-C 프로젝트에 비어 있습니다. [정의되지 않은 기호] Xcode ask Bridging Header가 생성 ( module_name-Bridging-Header.h)을 누르고이 파일의 경로를 설정합니다.

Project editor -> select a target -> Build Settings -> Swift Compiler - General -> Objective-C Bridging Header

Objective-C 클라이언트 코드로 모듈 가져 오기 [파일을 찾을 수 없음] [module_name]

#import "module_name-Swift.h"

더 많은 예제는 여기


0

XCode 11.3.1 :

objc 코드에서 Swift 내부 클래스를 사용하려는 경우 오류 "정의되지 않은 기호"(내부 클래스와 외부 클래스 모두)에 대해 컴파일되지 않으며 생성 된 "-swift.h"헤더를 확인했으며 두 클래스는 모두 그곳에.

몇 시간 동안 노력한 후에 내부 클래스를 일반 클래스로 변환하고 컴파일합니다.

프로젝트를 정리하고 DerivedData 폴더를 삭제하면 컴파일됩니다.


1
@objc내부 클래스 선언 전에 추가하려고 했습니까 ?
— dnnagy

덕분에 @dnnagy, 구문 문제가 아닌지 확인했습니다.
— 빌 찬

-1

위의 모든 작업을 수행 한 후에도 여전히 오류가 발생했습니다. 내 문제는 필요한 스위프트 파일이 어떤 이유로 번들 리소스에 추가되지 않았다는 것입니다.

[MyTarget]> Build Phases> Copy Bundle Resources로 이동하여 더하기 버튼을 클릭하고 Swift 파일을 추가하여이 문제를 해결했습니다.


번들 번들 리소스는 소스 코드를 포함해서는 안됩니다
— Bill Chan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.