[iOS] Objective-C, Swift 서로 사용하기

"Using Swift and Objective-C each other"

Posted by JacksonJang on March 22, 2024

실무에서 모든 프로젝트가 Swift 언어로 되어 있으면 얼마나 편했을까? 라는 생각이 들 때가 있다.
왜냐하면, 많은 곳에서 Objective-C를 사용하는 프로젝트가 있기 때문이다!
(Swift에 관심 없는 Objc 개발자도 있기 때문)

만약 Swift는 잘 다루고 Objective-C는 잘 다루지 못하고 이해만 가능한 상황이라면, Swift로 만들어서 Objective-C로 사용하면 된다! (제일 좋은건 둘다 잘 다루는 것이지만..)

Xcode 프로젝트 설정

Swift에서 Objective-C를 사용하든, Objective-C에서 Swift를 사용하든 어찌 되었든 Xcode 내에서 Bridging-Header 설정을 해야 합니다.
다음과 같이 2가지 방법으로 설정 할 수 있습니다.
개인적으로 저는 1번 방법을 추천합니다.

  1. Xcode 내에서 프로젝트에 직접 파일(Swift or Objective-C)을 생성하면 아래와 같은 화면이 나옵니다.

    여기서 Create Bridging Header 버튼을 클릭해 줍니다.
    그러면 자동으로 헤더 생성과 설정이 이루어 집니다.

  2. Xcode 프로젝트에 수동 설정 1번과 같이 헤더가 뜨지 않는다면 수동으로 설정해야 합니다.
    아래와 같은 순서로 진행하시면 됩니다.
    • 프로젝트 내에서 Header File로 생성 후 이름을 프로젝트명-Bridging-Header 으로 설정합니다.
    • 그 후에 Build Settings 에서 Swift Compiler 를 검색해서 Objective-C Bridging Header에 생성된 Header File의 경로를 넣어주면 설정이 끝납니다.

Objective-C 에서 Swift 실행

#import "프로젝트명-Swift.h"

위와 같이 import를 먼저 해줘야 Swift를 사용할 수 있습니다.
그렇다면, 프로젝트명-Swift.h는 갑자기 어디서 나왔을까? 사실 위에 있는 2번 사진을 자세히 보면 Generated Header Name을 보면 프로젝트명-Swift.h 으로 설정되어 있는 것을 볼 수 있다.

따라서, 설정된 Generated Header Name 을 import 해서 사용하면 된다.

하지만, import 를 해도 여전히 Swift를 사용할 수 없을 것이다.
왜냐하면 아직 Swift에서 @objc를 설정해주지 않았기 때문이다!

따라서, 아래와 같이 사용할 곳에 @objc를 붙여주면 된다.

1
2
3
4
5
@objc class SwiftExample: NSObject {
    @objc func print() {
        Swift.print("SwiftExample 테스트")
    }
}

완성 예시

#import "ViewController.h"
#import "ObjectiveCExample-Swift.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    SwiftExample *example = [[SwiftExample alloc] init];
    [example print];
}

@end

Swift 에서 Objective-C 실행

Objective-C 에서 Swift를 사용 했다면, 이번에는 반대로 해볼 예정이다.

Objective-C 를 사용하려면, 위에서 만든 Briding Header를 사용해야 한다.
다음과 같이 Header.h 안에 사용할 Objective-C 파일을 넣어주면 됩니다!

#import "헤더파일.h"

예시

#import "ViewController.h"

예시 GitHub

https://github.com/JacksonJang/ObjectiveCExample