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.hmy_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.