티스토리 뷰

iOS

Objective-C <-> Swift 코드 사용하기

hyeonii_12 2021. 2. 21. 15:21

Objective-C 프로젝트에서 Swift 코드 사용하기, Swift 프로젝트에서 Objective-C 코드 사용하기

저는 Swift 개발자이고, 회사의 레거시 코드는 Objective-C로 되어있습니다.
그래서 Objective-C 프로젝트와 Swift 프로젝트를 넘나들어야 할 때가 많은데요.
Objective-C 프로젝트에서 제가 작성한 Swift 코드를 사용해야 할 때나 Swift 프로젝트에서 회사의 Objective-C 모듈을 사용해야 할 때,
참고하기 위해 글을 써보려 합니다.


# Swift 프로젝트에서 Objective-C 사용하기

스위프트 프로젝트에서 오브젝티브-C 파일을 생성하면 아래와 같은 팝업을 볼 수 있습니다.

(App 이름은 못 본척..)

1. Create Bridging Header를 선택했을 경우

파일을 생성한 곳에 AppName-Bridging-Header.h 파일이 생성된 것을 볼 수 있습니다.
이 파일 안에 새로 만든 오브젝티브-C 파일의 헤더 파일을 임포트 해주면 됩니다.

#import "NewObjectiveCFile.h"

 

2. Don't Create를 선택하거나 팝업이 보이지 않을 경우

AppName-Bridging-Header.h 파일을 직접 생성해서 새로 만든 오브젝티브-C 파일을 임포트 해줍니다.
다만, 이 프로젝트에서 브릿징 헤더 파일을 사용하고 있다는 사실을 명시해주기 위해서
'Project - Target - Build Settings - Objective-C Bridging Header'파일의 위치/AppName-Bridging-Header.h 를 추가합니다.

너무 별 것 없어서 보여주기도 애매한 스크린샷

 

3. 끝...

너모 간단... 진짜 간단 끝판왕..
이제 어느 파일에서든 오브젝티브-C로 작성된 코드를 사용할 수 있습니다.

 

# Objective-C 프로젝트에서 Swift 사용하기

'Project - Target - Build Settings - Defines Module'을  Yes로 설정합니다.
추가한 Swift 파일에서 Objective-C에서 사용할 클래스나 함수명 앞에는 @objc를 달아주어야 합니다.

@objc class TestService {
	@objc static let shared = TestService()
    
    @objc func sayHello() {
    	print("Hello!")
    }
}

자 이제 스위프트 코드를 사용하고 싶은 오브젝티브-C 파일에서 해당 코드를 호출해 봅시다.

[[TestService shared] sayHello];

// error
Use of undeclared identifier 'TestService'

이 오류는 우리가 헤더 파일을 임포트 하지 않아서 생긴 오류인데요,
그렇다면 우리는 헤더 파일을 새로 생성해야 하느냐!
아닙니다! 우리가 위에서 Defines Module 을 Yes로 설정해 놓았기 때문에 컴파일 하는 과정에서 헤더 파일을 자동으로 생성해줍니다.
따라서 우리는 Xcode가 몰래 만들어 줄 헤더 파일을 임포트 해주기만 하면 됩니다.

#import "AppName-Swift.h"

앱 이름 뒤에 -Swift.h 만 붙인 파일을 임포트 해주고 새로 빌드하면 있던 에러도 사라지는 마법!
끝입니다! 얘도 안 어렵죠?

 

# 명심해야 할 것

1. Bridging Header의 파일 위치가 Build Settings에 작성한 위치와 동일한 지 확인해주세요!
2. Bridging Header 파일을 삭제할 때에도 Build Settings에 해당 파일이 삭제되었는 지 확인해주세요!
3. 빌드 과정에서 새로 생성되는 헤더 파일은 "AppName-Swift.h" 입니다!! Project File Name 과 Product Name을 다르게 사용하시는 분들의 경우 반드시 "Product Name-Swift.h" 파일을 임포트 해주세요!! (이걸로 한 시간 버림..)

'iOS' 카테고리의 다른 글

Universal Framework 만들기  (0) 2020.12.13
[iOS] Dark Mode 해제 (User Interface Style)  (5) 2020.10.19
댓글